奇怪的指针问题...使用指针数组构建BST

时间:2013-11-25 11:55:47

标签: c++ algorithm pointers binary-search-tree

所以我试图使用指针数组创建一个BST。我的算法是正确的(测试了一个不使用指针的版本),但是当使用下面的代码时,会发生以下情况:

  1. 如果我添加第一个元素,它将被添加到数组的第1位。
  2. 如果我添加第二个元素,由于某种原因,数组的位置1将被覆盖到此元素,然后程序继续(否则为部分)并尝试再次插入。
  3. EG。 (用一堆couts跟踪程序)

    1. Call add(5, 1)
    inserting 5 into position 1
    position 1 is now 5
    
    2. Call add(4, 1)
    position 1 is now 4
    moving right
    inserting 4 into position 3
    position 1 is now 4
    

    ...

    template <typename Item> void ABTree<Item>::add(Item input, int index){
        if (array[1]==0){
            array[1] = &input;
            size++;
        }else{
            if (input < *array[index]){
                if (array[2*index] == 0){
                    array[2*index] = &input;
                    size++;
                }else
                    add(input, 2*index);
            }else{
                if (array[(2*index)+1] == 0){
                    array[(2*index)+1] = &input;
                    size++;
                }else
                    add(input, (2*index)+1);
        }
    }
    

2 个答案:

答案 0 :(得分:0)

您提供的代码中存在很多问题。

  1. 分配临时变量的地址是 不予受理。 “输入”变量在添加后立即结束 功能返回。存储它的地址比无意义和引导 几乎不可避免的崩溃。特别是,当您向数组添加第二个元素时,这些条件检查:

    • if(array [1] == 0)
    • if(input&lt; * array [index])

    产生未定义的结果,因此未定义控制流。

  2. 我不知道你正在使用的容器的类型,但我认为它 是一种矢量甚至是普通的C数组。如果我的猜测是真的,那么你 应该在访问数组的元素之前执行边界检查 索引。

  3. 不执行由阵列执行的内存的重新分配。 或者,如果您使用的是恒定大小的数组,则不进行检查 执行(见2)。
  4. 因此,基于输出,在添加第二个元素时,您有以下顺序:

    • 检查头部是否为空 - 假;
    • 检查if(输入&lt; * array [index]) - false,因为array [index]包含垃圾,这就是“将4插入位置3”的原因,尽管我们应该将4添加到位置2;
    • 检查if(array [(2 * index)+1] == 0) - 再次为false,因为这个元素也包含垃圾(我是不是你没有用零初始化你的数组?); < / LI>
    • 因此,递归调用添加例程发生......

答案 1 :(得分:0)

我修改了代码以接受指向要插入的项目的指针。

if (array[1]==0){
    array[1] = input;
    size++;
}else{
    if (*input < *array[index]){
        if (array[2*index] == 0){
            array[2*index] = input;
            size++;
        }else
            add(input, 2*index);
    }else{
        if (array[(2*index)+1] == 0){
            array[(2*index)+1] = input;
            size++;
        }else
            add(input, (2*index)+1);
        }
}