我已经找到一个使用List / ArrayList的类似问题的答案,但是我最大的问题是我试图不使用数组以外的任何数据结构。有没有一种方法可以遍历BST,将值按顺序添加到数组中?
关于此问题的更多信息-我有一个BST,从技术上讲它是TreeMap,所以它有一个root.value
和root.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 /将其传递给数组,然后由于通过引用传递而将其添加到数组后进行更新,但是我无法将其放在上面。任何帮助将不胜感激。
答案 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);
}
}