Я пытаюсь реализовать красно-черное дерево в C #. Я уже создал объект с именем sRbTreeNode, который имеет свойства String key, Color, Left, Right и Parent.
Мне удалось успешно реализовать методы Insert, InsertFixUp, LeftRotate, RightRotate, Delete, и теперь у меня возникли проблемы с методом DeleteFixUp.
DeleteFixUp отвечает за балансировку дерева снова (используя повороты и изменяя цвета узлов) после удаления.
Я пытался реализовать метод из псевдокода, который я нашел в книге под названием «Введение в алгоритмы».
Вот мой код:
private static void DeleteFixup(ref sRbTreeNode root, sRbTreeNode x)
{
sRbTreeNode y;
while (x != root && x.Color == BLACK)
{
if (x == x.Parent.Left) // determine sub tree from parent
{
y = x.Parent.Right; // y is x's sibling
if (y.Color == RED)
{ // x is black, y is red - make both black and rotate
y.Color = BLACK;
x.Parent.Color = RED;
LeftRotate(ref root, x.Parent);
y = x.Parent.Right;
}
if (y.Left.Color == BLACK &&
y.Right.Color == BLACK)
{ // children are both black
y.Color = RED; // change parent to red
x = x.Parent; // move up the tree
}
else
{
if (y.Right.Color == BLACK)
{
y.Left.Color = BLACK;
y.Color = RED;
RightRotate(ref root, y);
y = x.Parent.Right;
}
y.Color = x.Parent.Color;
x.Parent.Color = BLACK;
y.Right.Color = BLACK;
LeftRotate(ref root, x.Parent);
x = root;
}
}
else
{ // right subtree - same as code above with right and left swapped
y = x.Parent.Left;
if (y.Color == RED)
{
y.Color = BLACK;
x.Parent.Color = RED;
RightRotate(ref root, x.Parent);
y = x.Parent.Left;
}
if (y.Right.Color == BLACK &&
y.Left.Color == BLACK)
{
y.Color = RED;
x = x.Parent;
}
else
{
if (y.Left.Color == BLACK)
{
y.Right.Color = BLACK;
y.Color = RED;
LeftRotate(ref root, y);
y = x.Parent.Left;
}
y.Color = x.Parent.Color;
x.Parent.Color = BLACK;
y.Left.Color = BLACK;
RightRotate(ref root, x.Parent);
x = root;
}
}
}
x.Color = BLACK;
}
Я продолжаю сталкиваться с ошибкой "Ссылка на объект не установлена на экземпляр объекта" каждый раз в разных местах ...
Я искал в Интернете реализации этого, только что нашел одну статью о CodeProject, которая реализовала его точно так же, как и я. Я попытался скопировать их код, надеясь, что мне что-то не хватает, но это не сработало ...
Может кто-нибудь помочь мне, прежде чем я начну рвать на себе волосы !! ... ??
:)