2010-02-12 107 views
5

我正在一个算法课程在大学,为我的项目之一,我想要实现在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'关键字的原因。

我在做什么错了?

+0

正如安德拉斯所说,向我们展示代码到目前为止,我们会给它一个镜头。 – 2010-02-12 13:20:54

回答

2

因为在你的方法的身体,你这样做:

root = y; 

你需要传递rootref修改。 node不需要一个,因为node本身从不更新为指向不同的ndoe。 。

+0

刚试过,它终于起作用了! 我不敢相信那是那么容易,我没有意识到这一点!... 非常感谢! – gillyb 2010-02-12 14:39:08

1

我不明白为什么你应该有过任何引用问题 - 左/右/父节点可以被复制,就像在这个伪代码。

你应该能够将其扩展到C#没有太多的大惊小怪 - 除非你正在使用的“裁判”的关键字,在这种情况下,你很可能得到不可预知的结果。

或许,如果你能证明你其实已经写了迄今为止的代码,我们可以帮助调试。

+0

好吧,我正在尝试使用ref关键字,并且我认为这是正确的方式... 我会尝试不使用ref,并查看它如何去,谢谢。 – gillyb 2010-02-12 13:24:59

+0

我刚刚用我到目前为止试过的代码编辑了这个问题,也许它会帮助你,因为它没有完全起作用,所以我在上面编辑的问题中解释了为什么。 – gillyb 2010-02-12 14:27:52

+0

好吧 - 你去了 - @AakashM为你排序! – 2010-02-12 14:41:53

1

我的建议:

  • 不包括父指针。它们对于插入或删除算法不是必需的,并且会使您的代码更加复杂。例如,LeftRotate只能使用一个参数编写,如果不使用父指针,则其大小只有一半。
  • 使用的enumColor属性,而不是一个string,并在构造函数初始化它。
  • 如果您尚未阅读this article
+0

我需要父指针来处理与结构相关的其他内容。这将使它沿着树行走更快。 – gillyb 2010-02-12 13:21:02

+1

即使您确实需要它们,也可能更容易在没有它们的情况下实现算法,并在以后添加它们。 – finnw 2010-02-12 13:43:12