令人困惑的部分原因是「Node」不應該是插入方法的參數,您應該調用在節點中定義的插入方法。
因此,假設您在「正常代碼」中持有「根」節點 - 我們稱其爲「rootNode」,只是爲了模糊。
好了,你的代碼插入到樹將是:
rootNode.insert(newValue);
很容易的。
現在定義該方法。
public class Node {
private int value;
private Node lower;
private Node higher;
public void insert(int newValue) {
if (newValue < value)
if(lower == null)
lower=new Node(value);
else
lower.insert(newValue);
else
if(higher == null)
higher=new Node(value);
else
higher.insert(newValue);
}
// and you'll need a constructor
public Node(int value) {
this.value=value;
}
}
這應該更清楚。我要打「Post」,然後我要編輯它,並弄清楚如何輕鬆折射這個邪惡的邪惡副本&粘貼代碼。
第二個想法,我會留在那裏,因爲它更具可讀性。我能看到的最好的解決方法是使節點的數組,然後你:
public class Node {
private int value;
private Node[] nodes=new Node[2];
private final int LOWER=0;
private final int HIGHER=1;
public void insert(int newValue) {
int index=LOWER;
if (newValue > value)
index=HIGHER;
if(nodes[index] == null)
nodes[index]=new Node(value);
else
nodes[index].insert(newValue);
}
}
但我不會取代原來的,因爲,正如我所說,它更清晰。
我推薦這本重構書。一旦你真的得到面向對象,它確實有助於簡化你的代碼。將一個對象傳遞給靜態方法(不使用成員變量的方法)是一種無用的方式。
關於@ ted的評論和OO的更多考慮 - getLeft和getRight不應該成爲問題。在抽象之外不是必需的。
一般來說你可能需要在節點這些方法:
public boolean doesContain(int value) {
if(value == this.value)
return true
else
return nodes[ this.value < value ? LOWER : HIGHER].doesContain(value);
}
,也許
public void getValuesSorted(LinkedList l) {
nodes[LOWER].getValuesSorted(l);
l.put(value);
nodes[HIGHER].getValuesSorted(l);
}
然後,你甚至都不需要公開,它是你正在處理與 - 一棵樹 - 拜託OO抽象。
請註明你得到的例外,不只是你在哪裏得到它。 – 2011-04-06 02:02:42
這裏是tree.BinaryTree.insert(BinaryTree.java:22)除外即時得到在線程異常 「主」 顯示java.lang.NullPointerException \t \t在tree.BinaryTree.insert(BinaryTree.java:15) \t在driver.Driver.main(Driver.java:16) – thunderousNinja 2011-04-06 02:05:48