Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在不使用其他数据结构的情况下,从BST检索已排序的值数组_Java_Arrays_Binary Search Tree - Fatal编程技术网

Java 在不使用其他数据结构的情况下,从BST检索已排序的值数组

Java 在不使用其他数据结构的情况下,从BST检索已排序的值数组,java,arrays,binary-search-tree,Java,Arrays,Binary Search Tree,我使用列表/数组列表找到了一个类似问题的答案,但我最大的问题是,我试图不使用数组以外的任何数据结构。是否有方法在BST上迭代,将值添加到数组中 关于这个问题,我有一个BST,从技术上讲,它是一个树形图,因此它有一个root.value和root.index,两者都是唯一的根。索引表示元素添加的顺序。我需要按升序返回索引的int[](按root.value) public int[]getDataInOrder(){ int[]orderedArray=新int[neededSize]; getD

我使用列表/数组列表找到了一个类似问题的答案,但我最大的问题是,我试图不使用数组以外的任何数据结构。是否有方法在BST上迭代,将值添加到数组中

关于这个问题,我有一个BST,从技术上讲,它是一个树形图,因此它有一个
root.value
root.index
,两者都是唯一的<代码>根。索引表示元素添加的顺序。我需要按升序返回索引的
int[]
(按
root.value

public int[]getDataInOrder(){
int[]orderedArray=新int[neededSize];
getDataInOrder(总根,0,orderedArray);
退货订单阵列;
}
私有void getDataInOrder(TreeNode根、int indexOfArray、int[]orderedArray){
if(root!=null){
getDataInOrder(root.left、indexOfArray、orderedArray);
orderedArray[indexOfArray]=根索引;
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);
UniqueIndex intTree=new UniqueIndex();
添加(5);
增加(7);
加上(-15);
添加(3);
intTree.add(1);
增加(6);
增加(10);

输出应该是
[2,4,3,0,5,1,6]
,但它是
[0,1,6,0,0,0,0]
。我觉得问题在于indexOfArray/由于引用的传递,在将元素添加到数组后传递它并进行更新,但我不能对它指手画脚。任何帮助都将不胜感激。

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

之后,只需执行顺序遍历,并将根索引分配给排序索引数组中的下一个空槽,然后递增已填充槽计数器

您的错误是将数组作为一个函数参数传递,如@realompoint所指出的

您可以这样做:

    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);
        }
    }
private int[]orderedaray=new int[neededSize];
私有int currentElement=0;
public int[]getDataInOrder(){
getDataInOrder(总根目录);
退货订单阵列;
}
私有void getDataInOrder(树节点根){
if(root!=null){
getDataInOrder(root.left);
orderedArray[currentElement]=根索引;
currentElement++;
getDataInOrder(root.right);
}
}

您似乎认为调用方法会看到方法内部的更新
indexOfArray
。但是Java是按值传递的,而不是按引用传递的。你是说第一个getDataInOrder()?这只是一个输入错误,应该以0开头。它不知道如何在重载方法中更新
indexOfArray
,我知道这一点。迭代时,我正在努力使
indexOfArray
正确地更新左右节点。我感觉在递归方法中缺少一个关键点,并在迭代时返回值。如何将值分配给方法(范围)之外的数组?如果我使用递归方法,我就不知道如何做到这一点。@I.KK。如果将数组放在递归方法之外,就不会落入我在回答中提到的按引用传递陷阱。
    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);
        }
    }