Binary Tree Level Order Traversal II
题目连接:https://oj.leetcode.com/problems/binary-tree-level-order-traversal-ii/
runtimes:9ms
一、问题
Given a binary tree, return the
bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root).
For example:
Given binary tree {3,9,20,#,#,15,7},
Given binary tree {3,9,20,#,#,15,7},
return its bottom-up level order traversal as:
二、分析
1、最直接的想法是层次遍历,并用另外一个队列记录每一个点的层数,按照层数放进相应的vector。最后再把结果逆反。
2、脑袋一抽又想到了另外一种不用逆反的方法,就是先按照层次遍历将节点放入队列,但是要先放右子树再放左子树,然后从队列尾部取出元素处理,方法相对应层次的vector里面,酱紫就不用逆反了。
三、小结
实现了第一种方案,但是其中要注意的是1、对于树结构一定要检查树是否为空;2、无符号整型不能和有符号整型比较,比如result.size() - 1,当size为0时,减去1得到的数将会是无符号整型数的最大值。
四、实现
#include <queue>
class Solution {
public:
vector<vector<int> > levelOrderBottom(TreeNode *root) {
vector <vector <int> > result;
if(root == NULL)
return result;
queue <TreeNode *> treeNodeQue;
treeNodeQue.push(root);
queue <int> que;
que.push(0);
while (treeNodeQue.size() > 0)
{
TreeNode *tree = treeNodeQue.front(); treeNodeQue.pop();
int counter = que.front(); que.pop();
if (tree->left != NULL)
{
treeNodeQue.push(tree->left);
que.push(counter + 1);
}
if (tree->right != NULL)
{
treeNodeQue.push(tree->right);
que.push(counter + 1);
}
int minus = result.size() - 1;
if (counter > minus)
{
vector <int> re;
re.push_back(tree->val);
result.push_back(re);
}
else{
result[counter].push_back(tree->val);
}
}
for (int i = 0, j = result.size() - 1; i < j; i++, j--)
{
vector <int> temp = result[i];
result[i] = result[j];
result[j] = temp;
}
return result;
}
};
五、三思
自己的解法挺不错的了~攒个!用java写的代码比较简洁,不过用了递归,空间消耗较大。
原文链接:http://blog.hfknight.com/?p=1249