1、题目
给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问)
样例
给一棵二叉树 {3,9,20,#,#,15,7}
:
3
/ \
9 20
/ \
15 7
返回他的分层遍历结果:
[
[3],
[9,20],
[15,7]
]
2、思路
层次遍历比前、中、后序遍历多了一些要处理的问题,比如:如何将每一层放进一组里?怎么保证层与层之间是在不同分组里面?
层次遍历就要考虑用队列来存放数据了,所以首先把根节点放进队列,之后开始每次判断队列不空则要建立一个vector来存每一层的数,为了隔开每一层的数一定要记得对vector里push完一层就要清空队始列!!最后把每一个小分组push进一个向量里面。
至于该到什么时候停止一层数据的划分,就要对每一层数据的个数计数。
我觉得以上两点是最重要的操作了。
3、代码
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root: The root of binary tree.
* @return: Level order a list of lists of integer
*/
public:
vector<vector<int>> levelOrder(TreeNode *root) {
// write your code here
vector<vector<int>>T;
queue<TreeNode*>q;
if(root==NULL)
{ return T; }
q.push(root);
int length=1;
while(!q.empty())
{
vector<int> t;
length=q.size();
while(length--)
{
TreeNode *temp=q.front();
t.push_back(temp->val);
q.pop();
if(temp->left)
q.push(temp->left);
if(temp->right)
q.push(temp->right);
}
T.push_back(t);
}
return T;
}
};
4、感想
思路里提到的两点,觉得以后还会用到的,尤其是计数。
层次遍历试了好几遍才ac,一直在纠结该怎么实现停止向队列里放元素,计数啊计数啊!!
这道题目要求的输出格式很有意思~~点赞!