1. 题目描述
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).
2. 样例
Given binary tree [3,9,20,null,null,15,7]:
return its bottom-up level order traversal as:
3. 分析
题目的意思是给出了一棵二叉树,让我们从下到上,从左到右按照层次遍历的顺序将节点的数值存储进一个二维的vector里面。
一拿到题目,我能想到最简单最容易实现的算法就是:按照正常的层次遍历的顺序,将每一层的节点存进vector里面,然后调用reverse函数进行逆序,从而得到从下到上遍历的结果。
因为,二维的vector:第一维里面的元素是一个一个的vector,而第二维才是对应树的每一层的元素值,因此,仅仅对外层的第一维vector做reverse运算就可以得到从下至上从左至右的结果。
分析到这里,我们就使用正常的层次遍历的非递归算法:利用队列node存储节点进行树的遍历,需要注意一点的是:我们设置了一个临时变量everyLevel用来存储每一层从左到右的节点数值,在每一层遍历结束后,将该vector推入最终的结果result的vector里面,然后对everyLevel进行清空操作。因此,判断每一行(即树的每一层)什么时候开始什么时候结束就显得很重要了。这里,我使用的方法是新建一个队列level专门存储当前正在访问的节点所在层数,随着node一起变化。与此同时再声明一个变量last_level用来存储上一个节点的层数,如果当前与上一个层数相同,则证明在同一行,如果不同则证明新开启了一层。
4. 源码
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int> > result;
vector<int> everyLevel;
queue<int> level;
queue<TreeNode*> node;
TreeNode* current_node = root;
int current_level = 0;
int last_level = 0;
if (root != NULL) {
level.push(current_level);
node.push(current_node);
while(!node.empty()) {
current_node = node.front();
current_level = level.front();
node.pop();
level.pop();
if (current_level > last_level) {
last_level = current_level;
result.push_back(everyLevel);
everyLevel.clear();
everyLevel.push_back(current_node->val);
}
else {
everyLevel.push_back(current_node->val);
}
if (current_node->left != NULL) {
node.push(current_node->left);
level.push(current_level+1);
}
if (current_node->right != NULL) {
node.push(current_node->right);
level.push(current_level+1);
}
}
result.push_back(everyLevel);
}
reverse(result.begin(), result.end());
return result;
}
};
5. 心得
本次题目虽然难度为medium,但是通过率不到40%,是BFS层次遍历的一个变形,我看见还有一个题目102.Binary Tree Level Order Traversal直接就是返回正常的层次遍历节点情况,那么就无需调用reverse这一步骤了。