题目链接:https://leetcode.com/problems/binary-tree-level-order-traversal/
Runtimes:9ms
1、问题
Given a binary tree, return the level order traversal of its nodes’ values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
return its level order traversal as:
[
[3],
[9,20],
[15,7]
]
2、分析
层次遍历,之前做过一道从底到上的层次遍历。这次从顶而下相对会简单些。用了队列来做过程存储。
3、小结
不是很熟悉queue的操作,如front()+pop()要结合用才能完成队头取后删除的过程,需要加强。对于出现指针,如链表、树等,要考虑到空指针问题。最后一点纠结了很久,其实不管如何,最后的一行vector vi再循环中试不会被加入进去的,因此要在循环后把最后一行压入vector v。
4、实现
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int> > levelOrder(TreeNode *root) {
vector < vector <int> > v;
if(root == NULL)
return v;
vector <int> vi;
queue <int> qi;
queue <TreeNode *> tq;
qi.push(0);
tq.push(root);
int level = 0;
while(tq.size() > 0)
{
TreeNode *p = tq.front();tq.pop();
int curLevel = qi.front();qi.pop();
if(p->left != NULL)
{
tq.push(p->left);
qi.push(curLevel + 1);
}
if(p->right != NULL)
{
tq.push(p->right);
qi.push(curLevel + 1);
}
if(level != curLevel){
v.push_back(vi);
vi.clear();
level = curLevel;
}
vi.push_back(p->val);
}
v.push_back(vi);
return v;
}
};
5、反思
一篇是从底至上遍历,一篇是求最大高度。可以参考一下。
文章链接1:http://blog.csdn.net/shawjan/article/details/43051489
文章链接2:http://blog.csdn.net/shawjan/article/details/44176799