题目如下:
Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree {3,9,20,#,#,15,7},
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [15,7], [9,20], [3] ]
分析如下:
本题和上一题几乎一样,只是要求最后结果使用和上一题相反的顺序输出。所以可以直接在上一题的基础上做修改。将最后结果反序输出即可。
代码如下:
//44ms过大集合
/**
* Definition for binary tree
* 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) {
vector<vector<int>> res_vec_vec;
if(root==NULL)
return res_vec_vec;
queue<queue<TreeNode*>> que_que;
queue<TreeNode*> que;
que.push(root);
que_que.push(que);
while(!que_que.empty()){
queue<TreeNode*> tmp_src_queue=que_que.front();
queue<TreeNode*> tmp_out_queue;
vector<int> tmp_vec;
while(!tmp_src_queue.empty()) {
tmp_vec.push_back(tmp_src_queue.front()->val);
TreeNode* tmp_node=tmp_src_queue.front();
if(tmp_node->left!=NULL)
tmp_out_queue.push(tmp_node->left);
if(tmp_node->right!=NULL)
tmp_out_queue.push(tmp_node->right);
tmp_src_queue.pop();
}
res_vec_vec.push_back(tmp_vec);
if(!tmp_out_queue.empty())//如果没有这个条件判断,程序就死循环了
que_que.push(tmp_out_queue);
que_que.pop();
}
int i=0,j=res_vec_vec.size()-1;
while(i<j){
vector<int> tmp=res_vec_vec[i];
res_vec_vec[i]=res_vec_vec[j];
res_vec_vec[j]=tmp;
i++;
j--;
}
return res_vec_vec;
//vector<vector<int>> res;
//for(int i=0;i<res_vec_vec.size();i++)
// res.push_back(res_vec_vec[(int)res_vec_vec.size()-i-1]);
//return res;
}
};
小结:
(1)为了性能,应该尽可能地少复制vector。通过实验发现。
如果使用交换原vector的方式,44ms过大集合。
int i=0,j=res_vec_vec.size()-1;
while(i<j){
vector<int> tmp=res_vec_vec[i];
res_vec_vec[i]=res_vec_vec[j];
res_vec_vec[j]=tmp;
i++;
j--;
}
如果使用逆序赋值原vector到新vector的方式,60ms过大集合。
vector<vector<int>> res;
for(int i=0;i<res_vec_vec.size();i++)
res.push_back(res_vec_vec[(int)res_vec_vec.size()-i-1]);
return res;
另外一个和vector相关的小tips是,尽可能地少删除vector中的元素。
update: 2015-03-24
1. 简化了代码 类似本题的前集题目。
2. 使用algorithm库中的std::reverse来进行反转。
// 11ms
class Solution {
public:
vector<vector<int> > levelOrderBottom(TreeNode *root) {
queue<TreeNode*> q;
if (root != NULL) {
q.push(root);
}
vector<int> inner;
vector<vector<int> > outer;
TreeNode* node;
while(!q.empty()) {
int size = q.size();
inner.clear();
while (size-- > 0) {
node = q.front();
q.pop();
inner.push_back(node->val);
if (node->left != NULL)
q.push(node->left);
if (node->right != NULL)
q.push(node->right);
}
outer.push_back(inner);
}
reverse(outer.begin(), outer.end());
return outer;
}
};