此题是上一道题的变体···最简单的方法就是把插入的方式变一变就可以了,或者把push_back函数改成insert
或者在最后reverse一下 都可以 但是奇怪的是,时间复杂度很高,竟然要64ms
后来看到discuss中一个8ms的程序 觉得差不多 并没什么区别 代码如下:
https://leetcode.com/discuss/92987/share-c-solution-8ms-easy-to-understand
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> vv;
std::queue<TreeNode*> q;
TreeNode* tn;
int n;
if(root)
q.push(root);
while(!q.empty()) {
n = q.size();
std::vector<int> v;
while(n) {
tn = q.front();
q.pop();
v.push_back(tn->val);
if(tn->left)
q.push(tn->left);
if(tn->right)
q.push(tn->right);
n--;
}
vv.push_back(v);
}
reverse(vv.begin(),vv.end());
return vv;
}
};
我发现用了reverse之后,时间复杂度由64猛减少到4ms 超过很多人···
代码中有注释,嘿嘿
class Solution {
public:
vector<vector<int>> levelOrderBottom(TreeNode* root) {
vector<vector<int>> res;
vector<int> level;
TreeNode* node;
if(root==NULL) return res; //注意root为空的时候返回的类型也是res这种
queue<TreeNode*> q;
int currlev=1;
int nextlev=0;
q.push(root);
while(!q.empty()){
node=q.front();
currlev--;
q.pop();
level.push_back(node->val);
if(node->left){
q.push(node->left);
nextlev++;
}
if(node->right){
q.push(node->right);
nextlev++;
}
if(currlev==0){
//res.insert(res.begin(),level); 这句话会让程序明显减慢
res.push_back(level);
currlev=nextlev;
nextlev=0;
level.clear();//level要清空
}
}
reverse(res.begin(),res.end()); //这句话起了翻转作用
return res;
}
};