我试图用Java编写二进制搜索树的数组实现。为此,我有以下两种方法负责确保所有数据都正确地添加到数组中
private int[] testData = {50, 25, 75, 10, 15, 5, 53, 29, 79, 78, 111, 33};
private int[] tree = new int[100];
private final int ROOT = tree.length / 2; //Root is at the center of the array
public void insert(int key)
{
if(tree[ROOT] == 0)
{
tree[ROOT] = key;
}
else
{
int locToInsert = findLocationToInsert(ROOT, key);
if(locToInsert == -1)
{
System.out.println("Error: Tree branch full");
}
else
{
tree[locToInsert] = key;
}
}
}
public int findLocationToInsert(int c, int key)
{
if(tree[c] != 0) //If current c is not empty
{
if(key > tree[c]) //Go right to find an empty c
{
findLocationToInsert(c + c/2, key);
}
else //Go left to find an empty c
{
findLocationToInsert(c - c/2, key);
}
}
return c;
}
但是,我的递归findLocationToInsert方法总是返回根。如何修复此实现以返回它找到的第一个空位置?
答案 0 :(得分:1)
你的递归函数对递归调用的结果没有任何作用。
findLocationToInsert(c + c/2, key);
正如您所看到的,您没有将返回的值分配给任何内容,因此它只是被丢弃。
因此,在您if
或else
执行后,它只会转到第return c
行并返回它所获得的原始c
- 这是根。
在您决定要对递归调用的值做什么之前,您应该注意另一个问题:您没有停止条件。
如果您实际填充了树,则应该根据您的其他方法返回-1
。但是您的函数中没有返回-1
的位置。如果树已满,它将陷入无限循环,你将获得堆栈溢出。