使用数组的Java中的二进制搜索树

时间:2015-02-25 21:37:00

标签: java arrays recursion tree binary-tree

我试图用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方法总是返回根。如何修复此实现以返回它找到的第一个空位置?

1 个答案:

答案 0 :(得分:1)

你的递归函数对递归调用的结果没有任何作用。

       findLocationToInsert(c + c/2, key);

正如您所看到的,您没有将返回的值分配给任何内容,因此它只是被丢弃。

因此,在您ifelse执行后,它只会转到第return c行并返回它所获得的原始c - 这是根。

在您决定要对递归调用的值做什么之前,您应该注意另一个问题:您没有停止条件。

如果您实际填充了树,则应该根据您的其他方法返回-1。但是您的函数中没有返回-1的位置。如果树已满,它将陷入无限循环,你将获得堆栈溢出。