Sie sind auf Seite 1von 5

#include<iostream>

#define black 1
#define red 0
typedef struct Node {
int key;
struct Node* left;
struct Node* right;
struct Node* parent;
int colour;
} Node;
class Redblacktree{
public:
Node *root;
Node *nil;
public:
Redblacktree();
void left_rotate(Node* n1);
void right_rotate(Node* n1);
Node* insert(Node* n1);
void RedBlackInsertFixup(Node *n1);
void inorder() ;
};
Redblacktree::Redblacktree() {
nil = (Node*) malloc(sizeof (Node));
nil->colour = black;
nil->parent = nil;
nil->left = nil;
nil->right = nil;
root = nil;
}
void Redblacktree::left_rotate(Node* n1) {
Node *temp;
temp = n1->right;
n1->right = temp->left; //turns n1's-right-left subtree to n1's right
if (temp->left != nil) {
temp->left->parent = n1;
}
temp->parent = n1->parent; //#
if (n1->parent == nil && temp != nil) {
root = temp;
} else if (n1 == n1->parent->left)
n1->parent->left = temp;
else {

n1->parent->right = temp;
}
temp->left = n1;
n1->parent = temp;
}
void Redblacktree::right_rotate(Node* n1) {
Node *temp;
temp = n1->left;
n1->left = temp->right; //turns n1's-left-right subtree to n1's left
if (temp->right != nil) {
temp->right->parent = n1;
}
temp->parent = n1->parent;
if (n1->parent == nil && temp != nil) {
root = temp;
} else if (n1 == n1->parent->right) {
n1->parent->right = temp;
} else {
n1->parent->left = temp;
}
temp->right = n1;
n1->parent = temp;
}
Node* Redblacktree::insert(Node* n1) {
Node *temp, *present;
temp = nil;
present = root;
while (present != nil) {
temp = present;
if (n1->key < present->key) {
present = present->left;
} else
present = present->right;
}
n1->parent = temp;
if (temp == nil)
root = n1;
else if (n1->key < temp->key)
temp->left = n1;

else
temp->right = n1;
n1->left = nil;
n1->right = nil;
n1->colour = red;
RedBlackInsertFixup(n1);
return root;
}
void Redblacktree::RedBlackInsertFixup(Node *n1) {
Node *temp;
while (n1->parent->colour == red) {
if (n1->parent == n1->parent->parent->left) {
temp = n1->parent->parent->right;
if (temp->colour == red) {
n1->parent->colour = black;
temp->colour = black;
n1->parent->parent->colour = red;
n1 = n1->parent->parent;
} else { //colour of temp is black
if (n1 == n1->parent->right) {
n1 = n1->parent;
left_rotate(n1);
}
n1->parent->colour = black;
n1->parent->parent->colour = red;
right_rotate(n1->parent->parent);
}
} else {
temp = n1->parent->parent->left;
if (temp->colour == red) {
n1->parent->colour = black;
temp->colour = black;
n1->parent->parent->colour = red;
n1 = n1->parent->parent;
} else { //colour of temp is black
if (n1 == n1->parent->left) {
n1 = n1->parent;
right_rotate(n1);
}
//if (n1->parent != nil) {
n1->parent->colour = black;
n1->parent->parent->colour = red;
left_rotate(n1->parent->parent);
//}
}
}
}
root->colour = black;
//nil->colour = black;

}
int main(int argc, char** argv) {
Redblacktree T;
Node *n1, temp, *root;
int i, flag = 1;
root = T.nil;
cout << "Enter the number of nodes you initially want in the Red black tree : ";
cin >> i;
cout << "enter the values : \n";
while (i--) {
n1 = (Node*) malloc(sizeof (Node));
cin >> n1->key;
n1->colour = red;
root = T.insert(n1);
}
cout<<"TREE :"<<endl;
T.inorder();
while (flag) {
cout << "Please enter your choice \n 0.Stop\n 1.Search\n 2.Minimum\n 3.Maximum\n
4.Successor\n ";
cout << "5.Predecessor\n 6.Insert\n 7.Delete\n \n";
cin >> i;
switch (i) {
case 0:
{
cout << "Thank you \n";
flag = 0;
break;
}
case :
{
n1 = (Node*) malloc(sizeof (Node));
cout << "Enter the value to insert\n";
cin >> n1->key;
n1->colour = red;
root = T.insert(n1);
cout<<"TREE :"<<endl;
T.BFS();
break;
} return0}

Das könnte Ihnen auch gefallen