我正在一个算法课程在大学,为我的项目之一,我想要实现在C#中红黑树(实现本身是不是项目,但只是我决定选择帮助我)。C#参考麻烦
我的红黑树应持有字符串键,我为每个节点创建的对象看起来是这样的:
class sRbTreeNode
{
public sRbTreeNode Parent = null;
public sRbTreeNode Right = null;
public sRbTreeNode Left = null;
public String Color;
public String Key;
public sRbTreeNode()
{
}
public sRbTreeNode(String key)
{
Key = key;
}
}
我已经增加了一些基本的方法来打印树,找到根,最小/ MAX键(按字母),等等
我无法插入节点(因此,建设树)。 熟悉红黑树的人都知道,当向一边添加节点时,您可能已经改变了树的平衡。 要解决此问题,您需要在树上的节点上“旋转”以平衡树。
我在伪代码中编写了一个RightRotate和LeftRotate方法,然后当我尝试在C#中实现它时,我遇到了一堆与创建的sRbTreeNode对象有关的引用问题。
这是伪代码我写的LeftRotate方法:
LeftRotate(root, node)
y <- node.Right;
node.Right <- y.Left;
if (y.Left != null)
y.Left.Parent <- node;
y.Parent <- node.Parent;
if (node.Parent = null)
root <- y;
else
if (node = node.Parent.Left)
node.Parent.Left = y;
else
node.Parent.Right = y;
y.Left <- node;
node.Parent <- y
我接收到的建议来实现它直线前进,但没有使用“REF”的关键字,其中我试图在第一。 这是我做的:
public static void LeftRotate(sRbTreeNode root, sRbTreeNode node)
{
sRbTreeNode y = node.Right;
node.Right = y.Left;
if (y.Left != null)
y.Left.Parent = node;
y.Parent = node.Parent;
if (node.Parent == null)
root = y;
else
if (node == node.Parent.Left)
node.Parent.Left = y;
else
node.Parent.Right = y;
y.Left = node;
node.Parent = y;
}
现在,当我调试,我看到它工作正常,但我通过这个方法的对象只有方法的范围内旋转。当它离开这个方法时,似乎没有改变实际的节点。这就是为什么我想到首先使用'ref'关键字的原因。
我在做什么错了?
正如安德拉斯所说,向我们展示代码到目前为止,我们会给它一个镜头。 – 2010-02-12 13:20:54