[英]level order traversal of binary tree
但它不打印所有级别,有人可以告诉这个代码有什么问题吗? 这是我的代码:##
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector< vector<int> > res;
TreeNode* ptr;
queue<TreeNode*> q;
vector<int> v;
if(root){
q.push(root);
q.push(NULL);
}
while(!(q.empty())){
ptr = q.front();
q.pop();
if(q.empty())
break;
if(ptr){
if(ptr->left)
q.push(ptr->left);
if(ptr->right)
q.push(ptr->right);
v.push_back(ptr->val);
}
else {
q.push(NULL);
res.push_back(v);
v.clear();
}
}
return res;
}
};
总结此代码中的整体逻辑:
1)维护一个队列,每个级别的节点都被推入,并在每个级别的最后一个元素之后推送一个NULL
指针。 通过将根元素推入队列,然后是NULL
,可以启动此算法。
2)每个级别的元素都从队列中弹出,并且它的子级被立即推回到队列中。
3)当NULL
指针从队列中弹出时,它必须意味着队列没有充满下一级别的元素,因此NULL
会立即被推回到队列中。
4)代码首先将从队列中出来的所有元素收集到临时缓冲区v
。 当一个NULL
指针从队列中弹出时, v
现在包含二叉树中单个级别上的所有元素,并且v
将push_back()
编辑为res
,即此函数的返回值。
错误发生在代码的这一部分:
ptr = q.front();
q.pop();
if(q.empty())
break;
这将从队列中删除下一个元素。 如果在删除元素后队列为空,则算法终止。
这里的意图是队列中的最后一个,最后一个剩余值始终是树中最低级别的最后一个值末尾的NULL
指针。 队列现在完全耗尽,算法终止。
不幸的是,该算法已经收集了v
向量中树中最低级别的所有值,并且完全跳过了保存它们的以下代码段:
q.push(NULL);
res.push_back(v);
v.clear();
push_back()
永远不会在树中的底层执行。 此函数的最终结果将永远不会包含二叉树中的最低级别。
将终止条件更改为:
if(q.empty())
{
res.push_back(v);
break;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.