我正在使用名为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。我不知道我应该如何改变这些节点的数据值。如有必要,我会将代码发布到程序的其余部分。
答案 0 :(得分:0)
好吧,while循环不会退出而newNode
不为空。这意味着一旦循环退出,newNode
将为null。我想你想要的是在RightChild
或LeftChild
节点为空时创建一个新节点,并将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
}