2015-11-03 236 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 
}