精选力扣500题 第10题 LeetCode 103. 二叉树的锯齿形层序遍历 c++详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第10题 LeetCode 103. 二叉树的锯齿形层序遍历 c++详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \\
9 20
/ \\
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
2、思路
(BFS)
O
(
n
)
O(n)
O(n)
我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。
这样我们会:
- 先扩展根节点;
- 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点;
- 再依次从左到右扩展第三层节点;
- 依次类推
然后在遍历过程中我们给每一层加一个结尾标记NULL
,当我们访问到一层的结尾时,由于BFS
的特点,我们刚好把下一层都加到了队列中。这个时候就可以给这层加上结尾标记NULL
了。
再给每一层加一个标记,奇数行为从左到右,偶数行为从右到左。
3、代码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> printFromTopToBottom(TreeNode* root) {
vector<vector<int>>res;
if(!root) return res;
queue<TreeNode*>q;
vector<int>level; //记录一层的节点
q.push(root);
q.push(NULL);// 一层的结尾标记
bool flag = false;
while(q.size())
{
auto t = q.front();
q.pop();
if(!t)
{
if(!level.size()) break; //避免陷入死循环
if(flag) reverse(level.begin(),level.end());
res.push_back(level);
level.clear();
q.push(NULL);
flag = !flag;
}
else
{
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return res;
}
};
原题链接:103. 二叉树的锯齿形层序遍历
以上是关于精选力扣500题 第10题 LeetCode 103. 二叉树的锯齿形层序遍历 c++详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第20题 LeetCode 704. 二分查找c++详细题解
精选力扣500题 第8题 LeetCode 160. 相交链表 c++详细题解
精选力扣500题 第61题 LeetCode 78. 子集c++/java详细题解
精选力扣500题 第6题 LeetCode 912. 排序数组c++详细题解