精选力扣500题 第13题 LeetCode 102. 二叉树的层序遍历c++详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了精选力扣500题 第13题 LeetCode 102. 二叉树的层序遍历c++详细题解相关的知识,希望对你有一定的参考价值。
1、题目
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7],
3
/ \\
9 20
/ \\
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
2、思路
(BFS) O(n)
我们从根节点开始按宽度优先的顺序遍历整棵树,每次先扩展左儿子,再扩展右儿子。
这样我们会:
- 先扩展根节点;
- 再依次扩展根节点的左右儿子,也就是从左到右扩展第二层节点;
- 再依次从左到右扩展第三层节点;
- 依次类推
然后在遍历过程中我们给每一层加一个结尾标记NULL
,当我们访问到一层的结尾时,由于BFS
的特点,我们刚好把下一层都加到了队列中。这个时候就可以给这层加上结尾标记NULL
了,每次遍历到一层的结尾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);// 一层的结尾标记
while(q.size())
{
auto t = q.front();
q.pop();
if(!t)
{
if(!level.size()) break;
res.push_back(level);
level.clear();
q.push(NULL);
}
else
{
level.push_back(t->val);
if(t->left) q.push(t->left);
if(t->right) q.push(t->right);
}
}
return res;
}
};
原题链接:33. 搜索旋转排序数组
以上是关于精选力扣500题 第13题 LeetCode 102. 二叉树的层序遍历c++详细题解的主要内容,如果未能解决你的问题,请参考以下文章
精选力扣500题 第21题 LeetCode 42. 接雨水c++详细题解
精选力扣500题 第47题 LeetCode 113. 路径总和 IIc++/java详细题解
精选力扣500题 第64题 LeetCode 101. 对称二叉树c++/java详细题解
精选力扣500题 第38题 LeetCode 300.长递增子序列c++/java详细题解
精选力扣500题 第34题 LeetCode 470. 用 Rand7() 实现 Rand10()c++ / java 详细题解