Как исправить эту функцию вставки в реализации красного черного дерева? - PullRequest
0 голосов
/ 23 апреля 2019

Я реализую красное черное дерево. Думаю, что-то не так с функцией исправления, она не вставляет узлы, как это должно быть, и дает неправильную высоту.

Я пытаюсьвставить файл в дерево, и это дает мне очень большую высоту

 typedef struct Node
{
char word[128];
char color;
struct Node *left;
struct Node *right;
struct Node *parent; 
} Node;

  struct Node  T_Nil_Node;
  Node* T_Nil = &T_Nil_Node;

struct Node* Root = NULL;

функция левого поворота:

 void rotateLeft( Node** T, Node* x)
{
Node *y  = x->right;
x->right = y->left;
if (y->left != T_Nil)
    y->left->parent = x;
y->parent = x->parent;
if (x->parent == T_Nil)
    *T = y;
else if (x == x->parent->left)
    x->parent->left = y;
else
    x->parent->right = y;
y->left   = x;
x->parent = y;
  }

правый поворот:

  void rotateRight(Node** T, Node* y)
 {
Node *x  = y->left;
y->left  = x->right;
if (x->right != T_Nil)
    x->right->parent = y;
x->parent = y->parent;
if (y->parent == T_Nil)
    *T = x;
else if (y == y->parent->right)
    y->parent->right = x;
else
    y->parent->left  = x;
x->right  = y;
y->parent = x;
 }

функция исправления (я думаю, что здесь что-то не так):

  void redBlackInsertFixup(Node** Root, Node* New)
 {
Node* temp;
while (New->parent->color == RED )
{
    if (New->parent == New->parent->parent->left)

        temp = New->parent->parent->right;
    else
        temp = New ->parent->parent->left;

    if (temp->color == RED)
    {
        New->parent->color = BLACK;
        temp->color = BLACK;
        New->parent->parent->color = RED;
        New = New->parent->parent;
    }
    else if (New == New ->parent->right)
    {
        New = New->parent;
        rotateLeft(Root, New);
        New->parent= BLACK;
        New->parent->parent=RED;
        rotateRight(Root, New->parent->parent);
    }
    else
    {
        if (New->parent== New->parent->parent->right)
        {
            New = New->parent;
            rotateRight(Root, New);
            New->parent= BLACK;
            New->parent->parent=RED;
            rotateLeft(Root, New->parent->parent);
        }
    }
}

//Root[0]->color = BLACK;
(*Root)->color= BLACK;
   }

функция вставки, которую я считаю правильной:

  void redBlackInsert(Node** T, char word[128])
 {
Node* z =  newNode(word);
Node* y =  T_Nil;
Node* x = *T;
while (x != T_Nil)
{
    y = x;
    if (strcmp(z->word,x->word)<0)
        x = x->left;
    else
        x = x->right;
}

z->parent = y;
if (y == T_Nil)
    *T = z;
else if (strcmp(z->word,y->word)<0)
    y->left  = z;
else
    y->right = z;

z->left  = T_Nil;
z->right = T_Nil;
z->color = RED;
redBlackInsertFixup(T, z);
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...