2015-06-21 51 views
1

我最近一直在研究二叉搜索樹及其在java中的實現。不過我的問題更多與obj有關。面向對象編程不僅僅是數據結構一類二叉樹的方法實現如下:數據更改問題

protected BinaryNode<AnyType> findMin(BinaryNode<AnyType> t) 
{ 

    //BinaryNode<AnyType> k= new BinaryNode<AnyType>(x); 
    if(t != null) 
     while(t.left != null) 
     { 
      t=t.left; 


     } 
    return t; 
} 

現在,如果不是「T」我把返回二叉樹的minimimum元素中的「根」,但最終沒有按」這種方法改變了「根」的值?其實我知道它不會改變它,但我不明白爲什麼。

+0

在我們可以客觀回答這個問題之前,我們可以假設'AnyType'包含一個'getValue()'方法,它可以解析某種'Number'?或者'AnyType'實現'Comparable'? – Makoto

回答

0

你不想改變root的實際值,這就是你使用t的原因。 並調用傳遞root的方法。 Root保持不變,並完成所有工作。

2

樹沒有任何變化。 t是您插入該方法的任何節點的臨時替代品。這是一樣的,當你這樣做:

int x = 5; 
int y = x + 1; 
System.out.println(x); 
System.out.println(y); 

輸出將仍然是:

+0

是的,但在這種情況下,x,y是原始數據類型,並且我認爲由於「t」是一個通過引用傳遞的對象,因此根應該更改 – enu

1

的方法改變了方法參數的值來自堆棧,並且該值是一個參考。所以你改變引用(這意味着指向別的東西,一些其他的內存區域),而不是引用指向的值(而不是該內存區域的內容)。

1

我認爲這種方法名字很差。這種方法所做的是通過左節點迭代,直到它到達最左邊的葉子,然後返回它。 __Update__第二個想法:實際上最左邊的葉子是樹的最小節點。所以這是有道理的。我的錯。

你不應該想改變樹的根。這是你的切入點。相反,你想記住它。如果它是一棵平衡樹,它可以保持樹的中點(或重心)。所以這很重要。

+0

握住電話;這是[二叉樹](https://en.wikipedia.org/?title=Binary_tree),不一定是[binary * search * tree](https://en.wikipedia.org/wiki/Binary_search_tree)。 *兩者之間存在差異。我不相信迭代所有左邊是正確的方法。 – Makoto

+0

問題@ElioNushi提到它是一個binart搜索樹,對嗎? – Alp

+0

我所看到的只是他提到他正在研究它,並不一定表明我們正在展示*是一個BST。 – Makoto

1

當您在java中調用方法時,通過引用將對象傳遞給您的方法findMin中名爲「t」的新變量。你正在改變你的時間塊中的「t」的參考,就是這樣。但不是你的樹根節點。

以此爲一個小測試:

public class RefTest { 

    static String nameM2 = "Italy"; 

    public static void main(String[] args) { 

     String nameM = "Spain", nameF = "France"; 

     System.out.println(nameM+", "+nameF); 
     change(nameM); 
     System.out.println(nameM+", "+nameF); 
    } 

    private static void change(String param) { 
     param = nameM2; 
    } 
} 

如果啓動它,這不是輸出:

Spain, France 
Italy, France 

相反,這就是:

Spain, France 
Spain, France 

因爲你改變了param對象中的引用,但在退出變更方法後再也不會再使用它。