我正在使用一维数组创建二叉搜索树。我的问题在于插入功能。
当我输出树时,插入5,8,3,1,4和9会产生正确的索引。但是,当我尝试将9之后的数字添加到树中时,索引不正确。例如,使用前面提到的数字,9的索引为7.如果我插入17,它应该是9的右子,而不是它的索引为15,它的索引是11.
我知道问题在于我如何增加 i ,但我不确定如何修复它。任何帮助表示赞赏。谢谢!
void insert(int x)
{
int i = 1; //Counter
if (ptr->arr[1] == -1) //If bst is empty.
{
ptr->arr[1] = x;
}
else
{
int *temp = &ptr->arr[1]; //Temp starts at root
int *parent = NULL;
while (*temp != -1 && *temp != x)
{
if (x < *temp)
{
parent = temp;
temp = &ptr->arr[i*2];
i++;
}
else
{
parent = temp;
temp = &ptr->arr[i*2+1];
i+=2;
}
}
*temp = x;
}
答案 0 :(得分:1)
您将当前节点维护在两个不同的变量中:指向节点的指针保存在temp
中,节点的索引保存在i
中。这本身 - 尽管可能不是最优的 - 不是问题。但是,您不能保持两个变量的一致性(您更新指针的方式与索引不同)。一个简单的解决方法是使其保持一致:
temp = &ptr->arr[i*2]; //the pointer update is correct
i = i * 2; //same update as above
//...
temp = &ptr->arr[i*2+1];
i = i * 2 + 1; //same update as above
在我看来,完全删除指针temp
并始终通过索引访问数组也是一个好主意。这不需要两个变量之间的任何同步。