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

C# 如何在构建二叉树时添加新节点,c#,binary-tree,nullreferenceexception,C#,Binary Tree,Nullreferenceexception,我正在使用名为RedBlackTree的BinaryTree类的另一个版本。我正在尝试用这个add方法构建树 public void Add(T val) { RedBlackNode<T> newNode = _rootNode; while(newNode != null) { if(val.CompareTo(newNode.Data) < 0) {

我正在使用名为RedBlackTree的BinaryTree类的另一个版本。我正在尝试用这个add方法构建树

 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);
    }
public void Add(T val)
{
RedBlackNode newNode=\u 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嗯,while循环不会退出,而
newNode
不会为null。这意味着
newNode
一旦退出循环就会为null。我想,如果
RightChild
LeftChild
节点为null,则需要创建一个新节点,并设置
newNode
到该节点

此外,正如Partha的回答所指出的,如果尚未设置
\u 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);
}
public void Add(T val)
{
RedBlackNode父节点=_rootNode;
RedBlackNode目标=null;
while(target==null)
{
if(val.CompareTo(parent.Data)<0)
{
if(parent.LeftChild==null)
target=parent.LeftChild=new RedBlackNode(parent);
其他的
parent=parent.LeftChild;
}
else if(val.CompareTo(newNode.Data)>=0)
{
if(parent.RightChild==null)
target=parent.RightChild=new RedBlackNode(parent);
其他的
parent=parent.rightshild;
}
}
target.Data=val;
target.IsBlack=false;
固定颜色(新节点);
}

嗯,while循环不会退出,而
newNode
不会为null。这意味着
newNode
一旦退出循环就会为null。我认为如果
RightChild
LeftChild
节点为null,您需要创建一个新节点,并将
newNode
设置为null

此外,正如Partha的回答所指出的,如果尚未设置
\u 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);
}
public void Add(T val)
{
RedBlackNode父节点=_rootNode;
RedBlackNode目标=null;
while(target==null)
{
if(val.CompareTo(parent.Data)<0)
{
if(parent.LeftChild==null)
target=parent.LeftChild=new RedBlackNode(parent);
其他的
parent=parent.LeftChild;
}
else if(val.CompareTo(newNode.Data)>=0)
{
if(parent.RightChild==null)
target=parent.RightChild=new RedBlackNode(parent);
其他的
parent=parent.rightshild;
}
}
target.Data=val;
target.IsBlack=false;
固定颜色(新节点);
}

在访问其他字段之前,需要先创建节点。因此,如果_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
}
public void Add(T val)
{
if(_rootNode==null)
{
RedBlackNode newNode=新的RedBlackNode();
newNode.Data=val;
newNode.IsBlack=false;
_rootNode=newNode;
返回;
}
//然后是你的逻辑
}

在访问其他字段之前,需要先创建节点。因此,如果_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
}
public void Add(T val)
{
if(_rootNode==null)
{
RedBlackNode newNode=新的RedBlackNode();
newNode.Data=val;
newNode.IsBlack=false;
_rootNode=newNode;
返回;
}
//然后是你的逻辑
}

您需要检查\u rootNode是否为空。如果为空,请使用new关键字创建一个节点,并将其分配给\u rootNode,然后退出此操作function@Partha为什么?只有当newNode为空时,代码才能到达那个点。虽然我认为这是事实上的重复,但这是另一个问题,因为OP显式地找到空-所以问题是not NRE,而是搜索停止的方式。@OP我不明白您接受的答案如何解决您的问题。如果您只进行该答案中描述的更改,
newNode
在循环结束时仍然保证为null,并将导致您前面描述的null referenceexception。实际上它没有解决我的答案。乍一看我以为会,但我仍在努力。你的答案是朝着正确方向迈出的又一步,尽管我收到的指示也说我应该在节点!=null时循环。我仍然在以这种方式实现它时遇到问题,而没有得到nullReferenceException。你需要检查是否_rootNode为空。如果为空,请使用new关键字创建一个节点,并将其分配给_rootNode,然后退出此操作function@Partha为什么?只有当newNode为空时,代码才能到达那个点。虽然我认为这是事实上的重复,但这是另一个问题,因为OP显式地找到了空-所以问题不是NRE,而是sea的方式拱形停止。@OP我不明白你接受的答案如何解决你的问题。如果你只做了答案中描述的更改,
newNode
在循环结束时仍然保证为null,并将导致你之前描述的NullReferenceException。实际上它没有解决我的答案。我认为它会你的回答是朝着正确的方向迈出的又一步,尽管我得到的指示也表明我是正确的