Я реализую красное черное дерево. Думаю, что-то не так с функцией исправления, она не вставляет узлы, как это должно быть, и дает неправильную высоту.
Я пытаюсьвставить файл в дерево, и это дает мне очень большую высоту
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);
}