二叉树的层次遍历ii binary-tree-level-order-traversal-ii
题目描述
给定一个二叉树,返回该二叉树由底层到顶层的层序遍历,(从左向右,从叶子节点到根节点,一层一层的遍历)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
该二叉树由底层到顶层层序遍历的结果是
[
[15,7],
[9,20],
[3]
]
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},
return its bottom-up level order traversal as:
[
[15,7],
[9,20],
[3]
]
解题思路
- 和原来的层次遍历相比,多了个从底层到顶层的要求,那么只需要将每一层遍历后的节点插入到结果的开头(类似头插法),就可以实现逆序。
- vector的插入:
vt.insert(vt.begin(), x);
把元素x插入到vt的开头
vt.insert(vt.begin() + 2, x);
把元素x插入到vt的第三个位置vt[2]
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
vector<vector<int> > levelOrderBottom(TreeNode* root) {
vector<vector<int> > res;
if(root == NULL) return res;
queue<TreeNode*> myque;
myque.push(root);
while(!myque.empty()) {
int size = myque.size();
vector<int> cur; //记录当前层的节点
for(int i = 0; i < size; i ++) {
TreeNode* temp = myque.front();
myque.pop();
cur.push_back(temp -> val);
if(temp -> left) myque.push(temp -> left);
if(temp -> right) myque.push(temp -> right);
}
//由于是底层到顶层,所以每次插入到开头
res.insert(res.begin(), cur);
}
return res;
}
};