Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何修复级别顺序遍历问题(二叉树)的无限循环错误_C++_Binary Tree_Tree Traversal - Fatal编程技术网

C++ 如何修复级别顺序遍历问题(二叉树)的无限循环错误

C++ 如何修复级别顺序遍历问题(二叉树)的无限循环错误,c++,binary-tree,tree-traversal,C++,Binary Tree,Tree Traversal,教授提供了这个代码,但我一直得到一个无限循环。我也不理解带有“:”in for循环的auto关键字 我似乎不明白虫子在哪里 vector<int> levelOrder(TreeNode* root) { vector<int> res; if (root == NULL) return res; queue<TreeNode*> q; q.push(root); while (!q.empty()) {

教授提供了这个代码,但我一直得到一个无限循环。我也不理解带有“:”in for循环的auto关键字

我似乎不明白虫子在哪里

vector<int> levelOrder(TreeNode* root) {
    vector<int> res;
    if (root == NULL)
        return res;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) {
        int size = q.size();
        for (int i = 0; i < size; i++) {
            TreeNode* curr = q.front();
            q.pop();
            if (curr->left != NULL) 
                q.push(curr->left);
            if (curr->right != NULL)
                q.push(curr->right);
            res.push_back(curr->data);
        }
    }
    return res;
}

...

int main () {
...
    vector<int> items = levelOrder(root);
    for (int item : items) {
        cout << item << " ";
    }
    cout << endl;
...
        return 0;
}

Infinite Loop
vector levelOrder(树节点*根){
向量res;
if(root==NULL)
返回res;
队列q;
q、 推(根);
而(!q.empty()){
int size=q.size();
对于(int i=0;i左!=空)
q、 按(当前->左);
如果(当前->右侧!=空)
q、 推送(当前->右侧);
res.push_back(当前->数据);
}
}
返回res;
}
...
int main(){
...
向量项=levelOrder(根);
用于(整数项:项){

cout首先,执行级别顺序遍历的经典方法是使用队列,您的代码正在这样做

但是,与使用
while(!q.empty())
条件依赖队列状态进行循环不同,对于
循环,您有一个完全不必要且可能有害的内部
。如果删除了内部循环,则代码应能正确运行

例如:

vector<int> levelOrder(TreeNode* root) {
    vector<int> res;
    if (!root)
        return res;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) 
    {
        TreeNode* curr = q.front();
        q.pop();
        if (curr->left) 
            q.push(curr->left);
        if (curr->right)
            q.push(curr->right);
        res.push_back(curr->data);
    }
    return res;
}
vector levelOrder(树节点*根){
向量res;
如果(!root)
返回res;
队列q;
q、 推(根);
而(!q.empty())
{
TreeNode*curr=q.front();
q、 pop();
如果(当前->左)
q、 按(当前->左);
如果(当前->右侧)
q、 推送(当前->右侧);
res.push_back(当前->数据);
}
返回res;
}

首先,执行级别顺序遍历的经典方法是使用队列,您的代码正在这样做

但是,与使用
while(!q.empty())
条件依赖队列状态进行循环不同,对于
循环,您有一个完全不必要且可能有害的内部
。如果删除了内部循环,则代码应能正确运行

例如:

vector<int> levelOrder(TreeNode* root) {
    vector<int> res;
    if (!root)
        return res;
    queue<TreeNode*> q;
    q.push(root);
    while (!q.empty()) 
    {
        TreeNode* curr = q.front();
        q.pop();
        if (curr->left) 
            q.push(curr->left);
        if (curr->right)
            q.push(curr->right);
        res.push_back(curr->data);
    }
    return res;
}
vector levelOrder(树节点*根){
向量res;
如果(!root)
返回res;
队列q;
q、 推(根);
而(!q.empty())
{
TreeNode*curr=q.front();
q、 pop();
如果(当前->左)
q、 按(当前->左);
如果(当前->右侧)
q、 推送(当前->右侧);
res.push_back(当前->数据);
}
返回res;
}

int size=q.size();for(int i=0;i
--如果仔细查看代码,您会发现这没有任何作用。循环是在这上面的行上控制的,即(
而(!q.empty())
)。除非教授提供了这段代码,并故意将错误放在其中,否则我会对教授保持警惕。我意识到问题不一定是代码。它在VIM上运行得很好,但在VSCode上运行得不好。问题似乎是针对基于范围的for循环。但你是对的,for循环是不必要的。你知道如何改革吗在for循环中?在你的帖子中,唯一基于范围的
for
循环是
main
中的循环,并且该循环似乎没有做任何有害的事情。我看到的问题是级别顺序遍历本身。--它在VIM上运行得非常好,但在VSCode上没有。--这意味着程序有一个或多个错误。VIM和VSCode也有缺陷不是编译器——您可能在一个测试中使用了g++,而在另一个测试中使用了Visual Studio。实际上,出于某种原因,似乎所有基于范围的for循环都不能在vscode上工作。我在一个新文件上尝试了一个基本的循环,但没有一个可以在没有返回语句错误的情况下工作(我还做了一些复制和粘贴的示例,仍然无法工作。)同样,vscode不是编译器。你需要找出VSCODE中使用的实际编译器。也许它不是C++ 11。<代码> int Sime= q.siz();(int i=0;i <大小;i++)< />代码。如果仔细看代码,你会发现这没有任何用处。(
而(!q.empty())
)。除非教授提供了这段代码,并故意将错误放在其中,否则我会对教授保持警惕。我意识到问题不一定是代码。它在VIM上运行得很好,但在VSCode上运行得不好。问题似乎是针对基于范围的for循环。但你是对的,for循环是不必要的。你知道如何改革吗在for循环中?在你的帖子中,唯一基于范围的
for
循环是
main
中的循环,并且该循环似乎没有做任何有害的事情。我看到的问题是级别顺序遍历本身。--它在VIM上运行得非常好,但在VSCode上没有。--这意味着程序有一个或多个错误。VIM和VSCode也有缺陷不是编译器——您可能在一个测试中使用了g++,而在另一个测试中使用了Visual Studio。实际上,出于某种原因,似乎所有基于范围的for循环都不能在vscode上工作。我在一个新文件上尝试了一个基本的循环,但没有一个可以在没有返回语句错误的情况下工作(我还做了一些复制和粘贴的示例,仍然无法工作。)同样,vscode不是编译器。你需要找出你在VSCODE中使用的实际编译器。也许它不是C++ 11。我同意<<代码> > < /Cord>循环是无用的。(我)不知道为什么它会造成伤害。据我所知,它只是在整个循环树上提供一个内部迭代,而外循环是。(不必要的)降级为在多个级别上进行迭代。我遗漏了什么吗?(…除了“只有死代码才是好代码”);-)我同意内部
for
循环是无用的。(!)我不明白为什么它会造成伤害。据我所知,它只是在整个树级别上提供内部迭代,而外部循环是(不必要的)降级为迭代级别。我有什么遗漏吗?(…除了“只有死代码才是好代码”);-)