如何解决级别顺序遍历问题(二叉树)的无限循环错误

时间:2019-04-29 04:18:43

标签: c++ binary-tree tree-traversal

教授提供了此代码,但我不断遇到无限循环。我也无法理解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

1 个答案:

答案 0 :(得分:2)

首先,进行级别顺序遍历的经典方法是使用队列,而您的代码正在执行该操作。

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

示例:

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;
}