public class Bst<E extends Comparable<E>> {
private BstNode<E> root;
public Bst(E data) {
root = new BstNode<>(data);
}
public void add(E data) {
root = arr(data,root);
}
private BstNode<E> add(E data, BstNode<E> startNode) {
if (startNode == null) {
startNode = new BstDupNode<>(data);
} else if (data.compareTo(startNode.data) < 0) {
startNode.left = add(data, startNode.left);
} else {
startNode.right = add(data, startNode.right);
}
return startNode;
}
public E[] getAllData(E[] template) {
index = 0;
inorderTraversal(template, root, index);
return template;
}
private int index;
private void inorderTraversal(E[] template, BstNode<E> startNode, int index) {
if (startNode != null) {
inorderTraversal(template,startNode.left, index);
template[index ] = startNode.data;
inorderTraversal(template, startNode.right, index);
}
}
private static class BstNode<E extends Comparable<E>> {
public int count;
public E data;
public BstNode<E> left , right;
public BstDupNode(E data) {
this.data = data;
left = right = null;
}
}
public static void main(String[] args) {
Bst<Integer> hello = new BstDup<>(7);
hello.add(8);
hello.add(3);
hello.add(1);
hello.add(6);
hello.add(4);
hello.add(10);
hello.add(14);
}
}
我得到的結果是
[7, 8, 10, 14, null, null, null, null, null, null, null]
我不知道為什么索引會時不時地設定回零。因為自從我設定了全域變數,它應該隨著隱居繼續而不斷計數,或者至少我是這么認為的。我想了解到底不只是回答,如果您能提供一些解釋,我將不勝感激。謝謝你。
uj5u.com熱心網友回復:
Java 使用pass-by-value,這意味著方法獲取其引數的值,但這些值與呼叫者的副本是分開的;因此,當您重新分配方法引數時,呼叫者不會看到該重新分配。
例如,這樣的方法:
void increment(int i) {
i;
}
沒有任何影響:該方法增加了它的副本i,但沒有使用該副本。
在您的情況下,問題在于您的inorderTraversal方法index按值獲取引數- 所以它有自己的副本 - 然后它增加該副本,這很好,但它的呼叫者永遠不會看到這種變化。
為了解決這個問題,我建議inorderTraversal回傳更新的index:
private int inorderTraversal(E[] template, BstNode<E> startNode, int index) {
if (startNode != null) {
index = inorderTraversal(template,startNode.left, index);
template[index ] = startNode.data;
index = inorderTraversal(template, startNode.right, index);
}
return index;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/363823.html
