您的位置:首页 > 其它

leetcode 每日一题 107. Binary Tree Level Order Traversal II

2016-03-26 15:51 323 查看
此题是上一道题的变体···最简单的方法就是把插入的方式变一变就可以了,或者把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;

}
};


后来改了一下 发现 用insert的方法和用reverse的方法差的真的很多·····
我发现用了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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: