avatar

目录
103二叉树的锯齿形层次遍历

题目链接

题目描述:

给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。

实例:
例如:
给定二叉树 [3,9,20,null,null,15,7]

leetcode
返回锯齿形层次遍历如下:

[
[3],
[20,9],
[15,7]
]

解题思路

  本题要求在常规的队列+BFS基础上进行“之字形”遍历。说明我们要对BFS的过程做出一些调整。
  我们观察发现,假设从第0层开始算起,偶数层输出顺序从左到右,而奇数层输出顺序从右到左。通常来说,我们一般习惯的输出顺序为从左到右,所以只需要一个队列利用其先进先出的特性即可完成需求。现在,我们可能会想念栈,因为栈的特点是先进后出,符合奇数层输出顺序。
  这时,我们需要引入c++ STL库中的一个容器——deque,也就是我们熟悉的双端队列。它可以同时实现先进先出和先进后出两个特点。也就是说从左到右,我们可以push_back(),即常规地从队尾进队;也可以push_front(),即从队头进队。

代码

cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if(!root)
return result;
queue<TreeNode*> queue_Tree;
queue_Tree.push(root);
int height = 0; //从第0层开始算起
while(!queue_Tree.empty()){
int n = queue_Tree.size(); //获取每一层的结点数
deque<int> deque_Tree; //双端队列
for(int i = 0; i < n; i++){
TreeNode* node = queue_Tree.front();
queue_Tree.pop();
if(height % 2 == 0) //偶数层,从左到右
deque_Tree.push_back(node->val);
else //奇数层,从右到左
deque_Tree.push_front(node->val);

if(node->left)
queue_Tree.push(node->left);
if(node->right)
queue_Tree.push(node->right);
}
height++;
result.push_back( vector<int>( deque_Tree.begin(), deque_Tree.end() ) );
}
return result;
}
};

如果有错误或者不严谨的地方,请务必给予指正,十分感谢。

文章作者: breadhunter
文章链接: http://yoursite.com/2020/03/04/103%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%94%AF%E9%BD%BF%E5%BD%A2%E5%B1%82%E6%AC%A1%E9%81%8D%E5%8E%86/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 breadhunter
打赏
  • 微信
    微信
  • 支付寶
    支付寶