給出一棵二叉樹,返回其節點值從底向上的層次序遍歷(按從葉節點所在層到根節點所在的層遍歷,然后逐層從左往右遍歷)
樣例
給出一棵二叉樹 {3,9,20,#,#,15,7},
3
/ \
9 20
/ \
15 7
按照從下往上的層次遍歷為:
[ [15,7], [9,20], [3] ]
思路:二叉樹的層次遍歷思路,借助隊列來實現。相當於廣度優先搜索,使用隊列(深度優先搜索的話,使用棧)。
若根節點為空,直接返回;
若根節點非空,則將根節點入隊,然后,判斷隊列是否為空,若不為空,則將隊首節點出隊,訪問,並判斷其左右子節點是否為空,若不為空,則壓入隊列。
因最終輸出是從最后一層到第一層的輸出,所以,直接調用reverse()函數,將整個容器翻轉就可以了。
/**
* Definition of TreeNode:
* class TreeNode {
* public:
* int val;
* TreeNode *left, *right;
* TreeNode(int val) {
* this->val = val;
* this->left = this->right = NULL;
* }
* }
*/
class Solution {
/**
* @param root : The root of binary tree.
* @return : buttom-up level order a list of lists of integer
*/
/*
思路:二叉樹的層次遍歷思路,借助隊列來實現,因最終輸出是從最后一層到第一層的輸出,
所以,直接調用reverse()函數,將整個容器翻轉就可以了。
*/
public:
vector<vector<int>> levelOrderBottom(TreeNode *root) {
// write your code here
vector<vector<int>> vec;
if(root==NULL){
return vec;
}
queue<TreeNode*> que;
que.push(root);
while(!que.empty()){
int count=que.size();
vector<int> vec_temp;
while(count--){
TreeNode* temp=que.front();
que.pop();
vec_temp.push_back(temp->val);
if(temp->left){
que.push(temp->left);
}
if(temp->right){
que.push(temp->right);
}
}
vec.push_back(vec_temp);
}
reverse(vec.begin(),vec.end());
return vec;
}
};
