107. 二叉树的层次遍历 II
给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其自底向上的层次遍历为:
[
[15,7],
[9,20],
[3]
]
思路
这道题与102. 二叉树的层次遍历不同之处在于该题是自底向上遍历输出,其实方法是一样的,先自上而下遍历,然后借助STL中的reverse取逆函数将数组逆序即可。这里用的递归自上而下求解的方法,也可以用队列求解。
code
/**
* 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:
void getDepth(TreeNode* node, vector<vector<int>> &res, int depth) {
if(node != NULL) {
if(res.size() <= depth) { // 这里的vector是个二维的,一维表示深度,因此当一维长度不够时,需要增加长度
res.push_back(vector<int>()); // 增加一个vector的长度
}
res[depth].push_back(node->val); // 位于该深度的节点存入vector
}
else {
return;
}
getDepth(node->left, res, depth+1); // 遍历左子树
getDepth(node->right, res, depth+1); // 遍历右子树
}
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
getDepth(root, res, 0);
reverse(res.begin(),res.end()); // 反转vector
return res;
}
};