从BST检索值的排序数组,而无需使用其他数据结构

时间:2019-12-03 17:03:51

标签: java arrays binary-search-tree

我已经找到一个使用List / ArrayList的类似问题的答案,但是我最大的问题是我试图不使用数组以外的任何数据结构。有没有一种方法可以遍历BST,将值按顺序添加到数组中?

关于此问题的更多信息-我有一个BST,从技术上讲它是TreeMap,所以它有一个root.valueroot.index,都是唯一的。 root.index表示元素添加的顺序。我需要以升序返回索引int[](按root.value)。

    public int[] getDataInOrder( ){
        int[] orderedArray = new int[neededSize];
        getDataInOrder(overallRoot, 0, orderedArray);
        return orderedArray;
    }

    private void getDataInOrder(TreeNode<E> root, int indexOfArray, int[] orderedArray){
        if (root != null){
            getDataInOrder(root.left, indexOfArray, orderedArray);
            orderedArray[indexOfArray] = root.index;
            indexOfArray++;
            getDataInOrder(root.right, indexOfArray, orderedArray);
        }
    } 

创建树

    UniqueIndex<Integer> intTree = new UniqueIndex<>();
    intTree.add(5);
    intTree.add(7);
    intTree.add(-15);
    intTree.add(3);
    intTree.add(1);
    intTree.add(6);
    intTree.add(10);

输出应为[2, 4, 3, 0, 5, 1, 6],但应为[0, 1, 6, 0, 0, 0, 0]。我觉得问题在于indexOfArray /将其传递给数组,然后由于通过引用传递而将其添加到数组后进行更新,但是我无法将其放在上面。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以做的是从函数调用参数中取出已排序的索引数组,即不要将其作为参数,而是在更高的范围内使用它。然后使用数组中当前填充元素的索引保留一个变量。

此后,只需执行有序遍历,然后将根索引分配给已排序索引数组中的下一个空插槽,然后增加已填充的插槽计数器。

您的错误是将数组作为@RealSkeptic指出的函数参数传递。

您可以执行以下操作:

    private int[] orderedArray = new int[neededSize];
    private int currentElement = 0;

    public int[] getDataInOrder( ){
         getDataInOrder(overallRoot);
         return orderedArray;
    }

    private void getDataInOrder(TreeNode<E> root){
         if (root != null){
           getDataInOrder(root.left);
           orderedArray[currentElement] = root.index;
           currentElement++;
           getDataInOrder(root.right);
        }
    }