私は大学でアルゴリズムのコースを取っています。私のプロジェクトの 1 つで、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」キーワードを使用することを考えた理由です。
私は何を間違っていますか?