leetcode-102.二叉树的层次遍历
修改前错误代码
class Solution {
public:vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> LL;
queue<TreeNode*> RR;
int lev=0;
if(root) LL.push(root);
while(!LL.empty()||!RR.empty()){
if(!LL.empty()){
while(!LL.empty()){
TreeNode* tmp=LL.front();
LL.pop();
res[lev].push_back(tmp->val);
if(tmp->left) RR.push(tmp->left);
if(tmp->right) RR.push(tmp->right);
}
lev++;
}
else if(!RR.empty()){
while(!RR.empty()){
TreeNode* tmp=RR.front();
RR.pop();
res[lev].push_back(tmp->val);
if(tmp->left) LL.push(tmp->left);
if(tmp->right) LL.push(tmp->right);
}
lev++;
}
}
return res;
}
};
解题思想:每层用一个队列单独遍历,下层的左右子树交给另一个队列。
错误原因:vector数组使用的不规范,res是vector<vector<>>类型,在外层没有插入vector的情况下,内层不能使用。见下:
if(){
while(){
```
res[lev].push_back(tmp->val);
```
}
lev++;
}
修改为:遍历结果先存储在临时的vector变量中,最后保存。见下:
if(){
vector<int> r;
while(){
```
r.push_back(tmp->val);
```
}
res.push_back(r);
}
修改后AC代码:
/** * 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>> levelOrder(TreeNode* root) {
vector<vector<int>> res;
queue<TreeNode*> LL;
queue<TreeNode*> RR;
if(root) LL.push(root);
while(!LL.empty()||!RR.empty()){
if(!LL.empty()){
vector<int> r;
while(!LL.empty()){
TreeNode* tmp=LL.front();
LL.pop();
r.push_back(tmp->val);
if(tmp->left) RR.push(tmp->left);
if(tmp->right) RR.push(tmp->right);
}
res.push_back(r);
}
else if(!RR.empty()){
vector<int> r;
while(!RR.empty()){
TreeNode* tmp=RR.front();
RR.pop();
r.push_back(tmp->val);
if(tmp->left) LL.push(tmp->left);
if(tmp->right) LL.push(tmp->right);
}
res.push_back(r);
}
}
return res;
}
};
浏览其他博客,提到比较多的问题(建议检查一下):
1.对于空输入[]不能解决。
2.vector数组初始化出错,代码中越界。