如何在构建二叉树时添加新节点

时间:2015-11-03 01:05:20

标签: c# binary-tree nullreferenceexception

我正在使用名为RedBlackTree的BinaryTree类的备用版本。我试图使用这种添加方法构建树。

 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是一个提供树根的私有字段。它由特定指令初始化为null。从正在读取文件信息的方法中的另一个类中调用此Add方法。在第一次迭代时,抛出nullReferenceException,我假设因为我尝试更改的节点为null。我不知道我应该如何改变这些节点的数据值。如有必要,我会将代码发布到程序的其余部分。

2 个答案:

答案 0 :(得分:0)

好吧,while循环不会退出而newNode不为空。这意味着一旦循环退出,newNode 将为null。我想你想要的是在RightChildLeftChild节点为空时创建一个新节点,并将newNode设置为该节点。

此外,正如Partha的回答所指出的那样,如果尚未设置_rootNode值,则需要初始化该值。

我真的不知道节点的父属性是如何设置的,所以我假设父节点被注入作为子节点的构造函数参数:

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);
}

答案 1 :(得分:0)

您需要在访问其他字段之前创建节点。因此,如果_rootNode为空,则使用新关键字创建。

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
}