当前位置:   article > 正文

“按照之字形顺序打印二叉树”_c#按之字形顺序打印二叉树

c#按之字形顺序打印二叉树

描述

给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)

数据范围:0≤n≤15000≤n≤1500,树上每个节点的val满足 ∣val∣<=100∣val∣<=100
要求:空间复杂度:O(n)O(n),时间复杂度:O(n)O(n)

例如:
给定的二叉树是{1,2,3,#,#,4,5}


该二叉树之字形层序遍历的结果是 

[

[1],

[3,2],

[4,5]

]

示例1

输入:{1,2,3,#,#,4,5}

返回值:[[1],[3,2],[4,5]]

说明:如题面解释,第一层是根节点,从左到右打印结果,第二层从右到左,第三层从左到右。

示例2

输入:{8,6,10,5,7,9,11}

返回值:[[8],[10,6],[5,7,9,11]]

示例3

输入:{1,2,3,4,5}

返回值:[[1],[3,2],[4,5]]

思路: 队列+层序遍历

层次遍历打印二叉树,用队列实现。 有一句话,我觉得说的特别好:做题=解法+模板,意思就是说,对于一道题目,首先明白正确的解法已经解决该问题70%,剩下的就直接套模板。

所以BFS的模板为:

  • 如果不需要确定当前遍历到了哪一层,模板如下:
  1. void bfs() {
  2. vis[] = {0}; // or set
  3. queue<int> pq(start_val);
  4. while (!pq.empty()) {
  5. int cur = pq.front(); pq.pop();
  6. for (遍历cur所有的相邻节点nex) {
  7. if (nex节点有效 &amp;&amp; vis[nex]==0){
  8. vis[nex] = 1;
  9. pq.push(nex)
  10. }
  11. } // end for
  12. } // end while
  13. }

上述是伪代码,不仅可用于二叉树,可针对所有用BFS解题。

  • 如果需要确定遍历到哪一层,模板如下:
  1. void bfs() {
  2. int level = 0;
  3. vis[] = {0}; // or set
  4. queue<int> pq(original_val);
  5. while (!pq.empty()) {
  6. int sz = pq.size();
  7. while (sz--) {
  8. int cur = pq.front(); pq.pop();
  9. for (遍历cur所有的相邻节点nex) {
  10. if (nex节点有效 &amp;&amp; vis[nex] == 0) {
  11. vis[nex] = 1;
  12. pq.push(nex)
  13. }
  14. } // end for
  15. } // end inner while
  16. level++;
  17. } // end outer while
  18. }

 此题跟“按层打印二叉树”,仅有一点区别,“按层打印二叉树”是每层都按照从左到右打印二叉树。 而此题是,按照奇数层,从左到右打印,偶数层,从右到左打印。 所以此题可直接套用模板,代码如下:

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };
  10. */
  11. class Solution {
  12. public:
  13. vector<vector<int> > Print(TreeNode* pRoot) {
  14. vector<vector<int>> res;
  15. queue<TreeNode*> que;
  16. if(pRoot == nullptr) return res;
  17. que.push(pRoot);
  18. int num = 0;
  19. while(!que.empty())
  20. {
  21. int len = que.size();
  22. vector<int> vec;
  23. num++;
  24. for(int i = 0;i < len; i++)
  25. {
  26. auto node = que.front();
  27. que.pop();
  28. vec.push_back(node->val);
  29. if(node->left)
  30. {
  31. que.push(node->left);
  32. }
  33. if(node->right)
  34. {
  35. que.push(node->right);
  36. }
  37. }
  38. if(num % 2 == 0)
  39. {
  40. reverse(vec.begin(), vec.end());
  41. }
  42. res.push_back(vec);
  43. }
  44. return res;
  45. }
  46. };

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/837147
推荐阅读
相关标签
  

闽ICP备14008679号