2015-10-07 68 views
1

我想從使用c#的二叉樹中刪除一個節點。這個例子只在節點沒有子節點時才起作用。我理解的缺失如何與孩子,但我越來越掛了,似乎我的問題是從一個缺乏C#的認識:將對象的設置引用爲null似乎不起作用

public class Tree 
{ 
internal class Node 
{ 
    public int Val { get; set; } 
    public Node Left { get; set; } 
    public Node Right { get; set; } 

    public Node(int val) 
    { 
     Val = val; 
    } 
} 

private Node root; 
public void Delete(int val) 
{ 
    Node current = this.root; 
    Node parent = null; 

    while (true) { 
     if (val < current.Val) { 
      parent = current; 
      current = current.Left; 
     } 


     else if (val > current.Val) { 
      parent = current; 
      current = current.Right; 
     } 

     else if (val == current.Val) { 
      current = null; 
      return; 
     } 
    } 

} 

} 

我的問題是在該行,我設定的電流= null。我打算使用它的方式是使用current = null來刪除當前節點。但它不起作用。如果我引用當前節點從父:

parent.Right = null; 

節點正確刪除,但顯然是一種痛苦,因爲我需要檢查,如果當前節點是正確的或節點的左子。我錯過了什麼?提前致謝!

+0

我建立了一些東西,'但它不起作用。'你能幫我解決嗎?閱讀http://stackoverflow.com/questions/25715034/binary-search-tree-c-sharp-delete-node-function –

+0

這種情況是[ref返回和本地人](https:// github.com/dotnet/roslyn/issues/118) –

回答

0

你不能這樣做。

current變量是與變量parent.Leftparent.Right變量分開的變量。

當你這樣做:

current = parent.Left; 

你複製值的變量,你不是一個變量鏈接到另一個。你可以把它比作郵件筆記。在一張便條上有一個地址,然後執行上述說明並將地址複製到另一個便條上。之後更改副本不會以任何方式或形狀更改原始筆記。

所以是的,你需要跟蹤你從哪個子引用變量中獲得了current

+0

具體說明您並未複製該值 - 您正在製作參考副本。爲了證明它 - 如果Node有Delete()擴展方法,並且你會調用current.Delete() - 它不會跟蹤引用來自哪裏。 – MajkeloDev

+1

那麼,一個引用也是一個值:)引用類型變量的值是一個引用。 –

+0

這是一種非常抽象的價值觀思考方式。 – MajkeloDev