2015-11-03 234 views
1

,當我與所謂RedBlackTree的二叉樹類的替代版本工作增加新的節點。我試圖用這種添加方法來構建樹。如何建立二叉樹

public void Add(T val) 
    { 
     RedBlackNode<T> newNode = _rootNode; 

     while(newNode != null) 
     { 
      if(val.CompareTo(newNode.Data) < 0) 
      { 
       newNode = newNode.LeftChild; 
      } 
      else if(val.CompareTo(newNode.Data) >= 0) 
      { 
       newNode = newNode.RightChild; 
      } 
     } 
     newNode.Data = val;  //nullReferenceException thrown here <--- 
     newNode.IsBlack = false; 
     FixColors(newNode); 
    } 

_rootNode是給出樹的根的私有字段。按照具體說明給出它初始化爲空。這個Add方法是從另一個類中從正在讀取文件信息的方法中調用的。在第一次迭代中,拋出了一個nullReferenceException,我假設因爲我試圖改變的節點是空的。我不知道我應該如何改變這些節點的數據值。如有必要,我會將代碼發佈到程序的其餘部分。

+0

您需要檢查_rootNode是否爲空。如果是這樣,使用新的關鍵字創建一個節點,並將其分配給_rootNode並退出此功能 – Partha

+0

@Partha爲什麼?當'newNode'爲空時,代碼只能達到這一點。 –

+0

雖然我認爲這是[什麼是NRE以及如何解決它]的重複(http://stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-doi-i-修復它)實際上這是不同的問題,因爲OP明確地發現空 - 所以問題不是NRE,而是搜索停止的方式。 –

回答

0

好,while循環是不會退出,而newNode不爲空。這意味着newNode一旦循環退出將變爲空。我認爲你想要的是創建一個新節點,如果RightChildLeftChild節點爲空,並將newNode設置爲那個。

此外,帕塔的回答指出,你需要如果尚未設置初始化_rootNode值。

我真的不知道該怎麼節點的parent屬性設置,所以我要去承擔父節點注入的子節點的構造函數參數:

public void Add(T val) 
{ 
    RedBlackNode<T> parent = _rootNode; 
    RedBlackNode<T> target = null; 

    while(target == null) 
    { 
     if(val.CompareTo(parent.Data) < 0) 
     { 
      if (parent.LeftChild == null) 
       target = parent.LeftChild = new RedBlackNode<T>(parent); 
      else 
       parent = parent.LeftChild; 
     } 
     else if(val.CompareTo(newNode.Data) >= 0) 
     { 
      if (parent.RightChild == null) 
       target = parent.RightChild = new RedBlackNode<T>(parent); 
      else 
       parent = parent.RightChild; 
     } 
    } 
    target.Data = val; 
    target.IsBlack = false; 
    FixColors(newNode); 
} 
+0

需要1/2對每個答案upvote由於某種原因只有一半的解決方案提供(但組合一個將是正確的)。 –

+0

@AlexeiLevenkov我不太瞭解其他答案中發生了什麼。你能解釋我錯過了什麼嗎?我認爲'_rootNode'是任何包含此方法的類的屬性(因此,'Add'不太可能需要初始化它)。 –

+0

@AlexeiLevenkov實際上'_'前綴的成員名稱約定通常用於只讀字段,所以甚至不清楚你可以在方法中更改'_rootNode'。 –

0

您需要在訪問其他字段之前創建節點。因此,如果_rootNode爲空,則使用new關鍵字創建。

public void Add(T val) 
{ 
     if(_rootNode == null) 
     { 
      RedBlackNode<T> newNode = new RedBlackNode<T>(); 
      newNode.Data = val; 
      newNode.IsBlack = false; 
      _rootNode = newNode; 
      return; 
     } 
     //Followed by your logic 
}