二进制树中的无限循环

时间:2014-07-22 15:26:33

标签: c++ tree binary-tree

这是用于构建二叉树的函数,其中参数是整数列表(列表)和要写入树(树)的空向量。我确定这是一个非常简单的错误,但由于某种原因,我忽略了导致这种循环的原因。谢谢你的帮助。

void buildTree(vector<int> list, vector<int> tree)
{
    for(int i=0; i<list.size(); i++)
    {
    bool placed = false;
    int source = 1;

        while(!placed)
        {
            if(tree[source] == NULL)
            {
                tree[source] = list[i];
                placed = true;
            }
            else if(list[i] < source)
            {
                source = 2*source;
            }

            else if(list[i] > source)
            {
                source = 2*source+1;
            }
        }
    }
}

5 个答案:

答案 0 :(得分:1)

假设list[0]为1,tree[1]不为NULL。在这种情况下,while循环将无限执行,因为没有满足树if条件。

答案 1 :(得分:0)

您的比较list[i] < sourcelist[i] > source应为list[i] < tree[source]list[i] > tree[source]。截至目前,您正在将要插入的值与树矢量的INDEX进行比较。

答案 2 :(得分:0)

问题是您要将值(即list[i])与索引(即source)进行比较,而不是使用tree[source]

else if(list[i] < tree[source])
{
    source = 2*source;
}
else if(list[i] > tree[source])
{
    source = 2*source+1;
}

此外,您的程序未指定list[i]等于tree[source]时会发生什么,这可能会导致无限循环。

您的程序的另一个问题是,在通过索引取消引用其中一个元素之前,它不会检查tree的大小。这可能会导致未定义的行为。要解决这个问题,请添加这个&#34; catch子句&#34;到你的while循环:

if (source >= tree.size()) {
    cerr << "Tree index exceeds the allocated size. Breaking the loop." << endl;
    break;
}

答案 3 :(得分:0)

您的代码存在一些问题:

- 你按值接收向量,在向函数的所有调用中复制向量,为此,在函数外部你无法访问写入的vector tree并且正在支付性能命中。
-i假设您正在使用空树(如果不是擦除行if (tree.size() < source) { tree.resize(source); }。这是因为无法预测表示树的向量大小,取决于列表中的元素。这可以通过增强分配更多空间以避免多次连续分配,例如:分配sources * factor(因子> 1.0)而不是像source这样的矢量。 - 您正在将列表元素与索引treeelse if(list[i] < source)进行比较,这需要与值进行比较。

void buildTree(const vector<int>& list, vector<int>& tree) {
    for (int i = 0; i < list.size(); i++) {
        bool placed = false;
        int source = 1;
        while (!placed) {
            if (tree.size() < source) {
                tree.resize(source);
            }

            if (tree[source - 1] == 0) {
                tree[source - 1] = list[i];
                placed = true;
            } else if (list[i] < tree[source - 1]) {
                source = 2 * source;
            } else if (list[i] > tree[source - 1]) {
                source = 2 * source + 1;
            }
        }
    }
}

std::vector<int> tree;
buildTree(std::vector<int>{5, 2, 4, 13, 8, 25, 32}, tree);

答案 4 :(得分:0)

你的逻辑似乎是错的。你正在比较&#34; list item&#34;使用&#34;索引源&#34;。

如果您正在尝试构造&#34;二进制堆&#34;,从结果树中没有元素开始,
代码可能很复杂。

而是尝试将列表复制到树中,然后使用
在树中调整前半部分元素 修改逻辑。