Java 在不使用其他数据结构的情况下,从BST检索已排序的值数组
我使用列表/数组列表找到了一个类似问题的答案,但我最大的问题是,我试图不使用数组以外的任何数据结构。是否有方法在BST上迭代,将值添加到数组中 关于这个问题,我有一个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
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);
}
}