C#引用麻烦

标签 c# algorithm red-black-tree

我正在大学学习算法类(class),对于我的一个项目,我想用 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;
    }
}

我已经添加了一些用于打印树、查找根、最小/最大键(按字母表)等的基本方法...

我无法插入节点(因此无法构建树)。 熟悉红黑树的人都知道,向一侧添加节点时,可能会改变树的平衡。 要解决此问题,您需要围绕树上的节点“旋转”以平衡树。

我用伪代码编写了 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”关键字的原因。

我做错了什么?

最佳答案

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

root = y;

您需要使用 ref 修饰符传递 rootnode 不需要一个,因为node 本身永远不会更新为指向不同的 ndoe。 .

关于C#引用麻烦,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2251897/

相关文章:

c# - 您可以使用 SOAP 和 WSHttpBinding 对 WCF 服务进行 jQuery 调用吗?

c# - NpgsqlProvider 和 ExecuteStoreQuery

algorithm - 从数组中提取前 N 个唯一整数

c# - 根的红黑树删除

c++ - 带有红黑树的免费列表分配器

c# - Marshal.SizeOf 结构返回过多的数字

c# - 在 C# 中获取 FTP 上的文件大小

java - 给定一个旧数组和一组需要跳过的索引位置,如何构造一个新数组?

php - 如何将两个值合并/合并到同一个数组中的单个键中

c++ - 在删除和重新插入元素时遍历树