原题:
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] ]
原题说法有点绕,意思是从最后一层开始往上逐层按层存储在vector容器中最后返回容器,想到先序遍历(后序遍历不行因为不知道二叉树的深度),最后reverse一下vector就行(不得不感叹vector的便利),不过递归调用速度虽然不错但是内存占用一直比较高,结果:
Success
Runtime: 4 ms, faster than 99.21% of C++ online submissions for Binary Tree Level Order Traversal II.
Memory Usage: 15.5 MB, less than 6.41% of C++ online submissions for Binary Tree Level Order Traversal II.
代码:
/**
* 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>> r;
int maxdepth=0;
vector<vector<int>> levelOrderBottom(TreeNode* root) {
dfs(root,1);
reverse(r.begin(),r.end());
return r;
}
void dfs(TreeNode* root,int depth){
if (root!=NULL&&depth>maxdepth){maxdepth++;vector<int> newv;r.push_back(newv);}
else if (root==NULL){return;}
r[depth-1].push_back(root->val);
dfs(root->left,depth+1);
dfs(root->right,depth+1);
return;
}
};
改成循环调用以后内存情况好了点:
Success
Runtime: 0 ms, faster than 100.00% of C++ online submissions for Binary Tree Level Order Traversal II.
Memory Usage: 13.8 MB, less than 84.07% of C++ online submissions for Binary Tree Level Order Traversal II.
代码:
/**
* 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) {
int maxdepth=-1;
vector<vector<int>> r;
if(root==NULL){return r;}
vector<TreeNode*> queue;
vector<int> queuedepth;
queue.push_back(root);
TreeNode* c=root;
int depth=0;
while(!queue.empty()){
if (depth>maxdepth){vector<int> newv;r.push_back(newv);maxdepth=depth;}
r[depth].push_back(c->val);
if(c->right!=NULL){queue.push_back(c->right);queuedepth.push_back(depth+1);}
if(c->left!=NULL){c=c->left;depth++;continue;}
else{c=queue.back();
queue.pop_back();
if(queue.empty()){break;}
depth=queuedepth.back();
queuedepth.pop_back();}
}
reverse(r.begin(),r.end());
return r;
}
};