2013-11-21 14 views
0

蔭試圖實施BST類遞歸插入節點方法爲什麼根始終在二叉樹這種方法插入方法無效

public void insertNode(Node r, Node n) 
{ 
    if(r == null) 
    { 
     System.out.println("r=n"+ n.data); 
     r = n; 
    } 
    else 
    { 
     System.out.println("r=! null finding place in tree for "+ n.data); 
     if(n.data <= r.data) 
     { 
      if(r.left == null) 
       r.left = n; 
      else 
       insertNode(r.left, n); 
     } 
     else 
     { 
      if(r.right == null) 
       r.right = n; 
      else 
       insertNode(r.right, n); 
     } 
    } 
} 

我試着去調用這個方法就像這樣:

int[] arrTree = {34, 2, 56, 12, 44, 39, 56, 1}; 
    BT t = new BT(); 
    for (int i = 0; i < arrTree.length; i++) 
    { 
     //System.out.println("Tree Root = "+ t.getRoot()); 
     BT.Node n = t.new Node(arrTree[i]); 
     t.insertNode(t.root, n); 
    } 

但我總是得到這樣的輸出:

r=n34 
r=n2 
r=n56 
r=n12 
r=n44 
r=n39 
r=n56 
r=n1 

Node是一個內部類的BT。

運行,並嘗試不同的事物是什麼林做錯小時後,我無法弄清楚。

+0

的可能重複的[是Java「的傳遞按引用」或「通過按值」?](http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or -pass-by-value) – Dukeling

回答

1

由您所示的代碼來看,我的錢是在錯誤是在這裏:

public void insertNode(Node r, Node n) 
{ 
    if(r == null) 
    { 
     System.out.println("r=n"+ n.data); 
     r = n; //you overwrite the value of r but never use it 
    } 

Node r實際上是一個單獨提及任何t.root指,所以與另一個值不會改變取代r無論t.root是指方法之外。您可以修改方法內的引用數據,但不能修改引用本身。

0

當您在方法中設置R,它不會影響您在通過該節點。因此t.root永遠不會設置。

1

Java是傳遞的價值語言。如果對象傳遞參考值,則創建新參考

public void insertNode(Node r, Node n) { 
    if(r == null) { 
     r = n; 
    } 

在這裏您代替新的參考到根與其他參考;原始參考根(t.root)保持不變。

要解決此問題,可以刪除insertNode()方法中的第一個參數 - 樹的根是其實現的一部分,因此該樹已知道對其根的引用。將insertNode()內的所有r更改爲this.root

+0

嗨,謝謝。但是如果我拿走r,我怎麼能使用遞歸方法呢? – banditKing

+0

對此的措辭有點不對。您傳遞參考值,但參考值不允許您重新分配參考值。你根本沒有創建一個新的參考。 – Makoto

+0

@Makoto你會說什麼被重新分配呢?因爲你正在重新分配一些東西。 – Dukeling