Leetcode-102.二叉树层序遍历
Posted Booksort
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Leetcode-102.二叉树层序遍历相关的知识,希望对你有一定的参考价值。
题目链接
写这博客,主要是想回顾一下二叉树的层序遍历。
我们都知道,二叉树有 前序遍历、中序遍历、后序遍历,这些遍历方式用递归的方法改变访问节点的顺序就能得到这些遍历方式。
而层序遍历,是每一层去遍历这些节点,一层一层的遍历,这一层遍历完了,才回去遍历下一层节点。
而层序遍历是要借助queue队列,这个数据结构。
介绍一下方法。
从二叉树的第一个节点开始,把这个节点放入队列中。当走到尽头时,这一行没有节点了。就把这个节点出队,然后还要把该节点的两个左右子节点入队,先左节点,再右节点
如果是空,就不入队(看题目要求)。走完后,再次依次将队列中的元素出队,同时也要将其子节点入队,同样先左后右。
就这样,每次都要将元素出队,再同时将其子节点入队。
就饿这样循环往复,直到,队中为空,为空就意味着二叉树已经全部遍历完了。
来看看题目。
题目要求依次排布在一个二维数组中,满足原二叉树的顺序,不显示NULL。
这样每次,每排元素都需要一个数组来接受。
同时,每排元素统计完后,都要更新下一排的元素个数。
那这个元素个数就来自于队列中的元素个数。
因为,当你对类中一排的元素以及出完后,下一排的元素已经全部进入到队列中。
因为,每次元素出队都要将其子节点全部入队。
这样就能保证,当一排元素出完后,队列中右下一排的全部元素。同时,当队列为空时,也意味着,二叉树节点已经遍历完了。
在处理一排元素时,放在一个循环里,而循环结束的条件就是这一排元素的个数,而,这个元素的个数,在进入循环前已经统计好了。
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> v;
queue<TreeNode* > q;
int levelSize=0;
if(root!=nullptr)
{
q.push(root);
levelSize=1;
}
while(!q.empty())
{
levelSize=q.size();//统计这一排元素的个数
vector<int> vv;
for(int i=0;i<levelSize;i++)//出队,放入数组中,同时带入其子节点
{
TreeNode* node=q.front();
q.pop();
if(node->left)
q.push(node->left);
if(node->right)
q.push(node->right);
vv.push_back(node->val);
}
v.push_back(vv);
}
return v;
}
};
回顾一下知识点。
以上是关于Leetcode-102.二叉树层序遍历的主要内容,如果未能解决你的问题,请参考以下文章