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,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
1.个人分析
先考虑自顶向下的情况,利用层次遍历将每层的节点分别保存到二维数组的每一行,最后将结果进行反转返回即可。
2.个人解法
vector<vector<int>> levelOrderBottom(TreeNode* root)
{
vector<vector<int>> result;
if(!root)
return result;
queue<TreeNode*> Q;
Q.push(root);
int level = 0; //层次数从0开始,以适配二维数组行号
while(!Q.empty()){
int len = Q.size(); //记录每层所含的节点数
while(len-- > 0){
TreeNode *node = Q.front();
if(level == result.size()){
result.push_back({node->val});//将节点保存到新的一行,该语句只在C++ 11以后的标准支持
}else {
result[level].push_back(node->val); //保存节点到当前行
}
Q.pop();
if(node->left)
Q.push(node->left);
if(node->right)
Q.push(node->right);
}
++level;
}
reverse(result.begin(), result.end()); //将结果逆序返回
return result;
}
3.参考解法
递归求解:
void levelOrderTop(TreeNode* r, int level, vector<vector<int>>& res)
{
if (!r) return;
if (level == res.size()){
res.push_back({r->val});
}else
res[level].push_back(r->val);
levelOrderTop(r->left, level+1,res);
levelOrderTop(r->right, level+1,res);
}
vector<vector<int>> levelOrderBottom(TreeNode* root)
{
vector<vector<int>> res;
levelOrderTop(root, 0, res);
reverse(res.begin(), res.end());
return res;
}
该递归解法确实要比非递归解法简洁很多,但递归方法在效率和易读性上要差的多。
4.总结
刚开始是自己把问题复杂化了,想了很久也没有想出比较好的解法,原因是自己对二叉树的层次遍历还没达到一个灵活运用的地步。后来通过查阅与层次遍历相关的资料和参考他人的递归解法后才最解决了该问题,另外自己在vector作为二维数组时如何开辟新的一行也遇到了困难,后来发现在C++11中是支持花括号初始化vector的,通过push_back开辟新行的问题也就迎刃而解了。
PS:
- 题目的中文翻译是本人所作,如有偏差敬请指正。
- 其中的“个人分析”和“个人解法”均是本人最初的想法和做法,不一定是对的,只是作为一个对照和记录。