所以我试图使用指针数组创建一个BST。我的算法是正确的(测试了一个不使用指针的版本),但是当使用下面的代码时,会发生以下情况:
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);
}
}
答案 0 :(得分:0)
您提供的代码中存在很多问题。
分配临时变量的地址是 不予受理。 “输入”变量在添加后立即结束 功能返回。存储它的地址比无意义和引导 几乎不可避免的崩溃。特别是,当您向数组添加第二个元素时,这些条件检查:
产生未定义的结果,因此未定义控制流。
我不知道你正在使用的容器的类型,但我认为它 是一种矢量甚至是普通的C数组。如果我的猜测是真的,那么你 应该在访问数组的元素之前执行边界检查 索引。
因此,基于输出,在添加第二个元素时,您有以下顺序:
答案 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);
}
}