#include<stdio.h>
#include<math.h>
#include<stdlib.h>
struct tnode
{
int data; char color;
struct tnode* parent;
struct tnode* rightChild;
struct tnode* leftChild;
};
struct tree
{
struct tnode* root;
struct tnode* nil;
};
struct tnode* createnode(int data)
{
struct tnode *newnode;
newnode
=(struct tnode
*)malloc(sizeof(struct tnode
)); newnode->data=data;
newnode->color='R';
newnode->leftChild=NULL;
// newnode->parent=NULL;
newnode->rightChild=NULL;
return newnode;
}
void leftrotate(struct tree*T, struct tnode*x)
{
struct tnode * y;
y
=(struct tnode
*)malloc(sizeof(struct tnode
)); y=T->nil;
if(x->rightChild==NULL)
return;
y=x->rightChild;
x->rightChild=y->leftChild;
if(y->leftChild!=T->nil)
y->leftChild->parent=x;
y->parent=x->parent;
if(x->parent==T->nil)
T->root=y;
else if (x==x->parent->leftChild)
x->parent->leftChild=y;
else
x->parent->rightChild=y;
y->leftChild=x;
x->parent=y;
}
void rightrotate(struct tree*T, struct tnode*x)
{
struct tnode * y;
y
=(struct tnode
*)malloc(sizeof(struct tnode
)); y=x->leftChild;
x->leftChild=y->rightChild;
if(y->rightChild!=T->nil)
y->rightChild->parent=x;
y->parent = x->parent;
if ( x->parent == T->nil)
T->root = y;
else if (x==x->parent->rightChild)
x->parent->rightChild=y;
else
x->parent->leftChild=y;
y->rightChild=x;
x->parent=y;
}
void rbinsertfixup(struct tree*T, struct tnode*z)
{
struct tnode*y;
y
=(struct tnode
*)malloc(sizeof(struct tnode
)); struct tnode*x;
x
=(struct tnode
*)malloc(sizeof(struct tnode
)); if(T->root==z)
{
z->color='B';
return;
}
while(z->parent!=NULL && z->parent->color=='R')
{
y=z->parent->parent;
if(y->leftChild==z->parent)
{
if(y->rightChild!=NULL)
{
x=y->rightChild;
if(x->color=='R')
{
z->parent->color='B';
x->color='B';
y->color='R';
z=y;
}
}
else
{
if(z->parent->rightChild==z)
{
z=z->parent;
leftrotate(T,z);
}
z->parent->color='B';
y->color='R';
rightrotate(T,y);
}
}
else
{
if(y->leftChild!=NULL)
{
x=y->leftChild;
if(x->color=='R')
{
z->parent->color='B';
x->color='B';
y->color='R';
z=y;
}
}
else
{
if(z->parent->leftChild==z)
{
z=z->parent;
rightrotate(T,z);
}
z->parent->color='B';
y->color='R';
leftrotate(T,y);
}
}
T->root->color='B';
}
}
void insertion(struct tree *T, struct tnode *z)
{
struct tnode * y;
y
=(struct tnode
*)malloc(sizeof(struct tnode
)); struct tnode * x;
x
=(struct tnode
*)malloc(sizeof(struct tnode
)); y=T->nil;
x=T->root;
if(T->root==NULL)
{
T->root=z;
z->parent=NULL;
}
else
{
while(x!=T->nil)
{
y=x;
if(z->data < x->data)
x=x->leftChild;
else
x=x->rightChild;
}
z->parent=y;
if(y==T->nil)
T->root=z;
else if (z->data< y->data)
y->leftChild=z;
else
y->rightChild=z;
// z->leftChild=T->nil;
/// z->rightChild=T->nil;
// z->color='R';
}
if(z->parent!=NULL)
{
if(z->parent->parent==NULL)
z->parent->color='B';
else
rbinsertfixup(T,z);
}
T->root->color='B';
}
void visit(struct tnode* x)
{
if(x!=NULL)
{
visit(x->leftChild);
if(x->parent!=NULL)
printf("%d %c %d \n", x
->data
, x
->color
, x
->parent
->data
); else
printf("%d %c NIL \n", x
->data
, x
->color
);
visit(x->rightChild);
}
}
void pre_fix_tour (struct tree* T)
{
if(T->root==NULL)
else
visit(T->root);
}
int main()
{
//int a[]={5,4,1,6,10,11};
int i; int n;
int a[n];
for(i=0;i<n;i++)
struct tnode* node;
struct tree *treen;
treen
=(struct tree
*)malloc(sizeof(struct tree
)); treen->nil=NULL;
treen->root=NULL;
for(i=0;i<n;i++)
{
node=createnode(a[i]);
insertion(treen, node);
}
pre_fix_tour(treen);
return 0;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8bWF0aC5oPgojaW5jbHVkZTxzdGRsaWIuaD4Kc3RydWN0IHRub2RlCnsKCWludCBkYXRhOyBjaGFyIGNvbG9yOwoJc3RydWN0IHRub2RlKiBwYXJlbnQ7IAoJc3RydWN0IHRub2RlKiByaWdodENoaWxkOwoJc3RydWN0IHRub2RlKiBsZWZ0Q2hpbGQ7Cn07CnN0cnVjdCB0cmVlCnsKCXN0cnVjdCB0bm9kZSogcm9vdDsKCXN0cnVjdCB0bm9kZSogbmlsOwp9OwoKCnN0cnVjdCB0bm9kZSogY3JlYXRlbm9kZShpbnQgZGF0YSkKewoJc3RydWN0IHRub2RlICpuZXdub2RlOwoJbmV3bm9kZT0oc3RydWN0IHRub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOwoJbmV3bm9kZS0+ZGF0YT1kYXRhOwoJbmV3bm9kZS0+Y29sb3I9J1InOwoJbmV3bm9kZS0+bGVmdENoaWxkPU5VTEw7Ci8vCW5ld25vZGUtPnBhcmVudD1OVUxMOwoJbmV3bm9kZS0+cmlnaHRDaGlsZD1OVUxMOwoJcmV0dXJuIG5ld25vZGU7Cn0KCnZvaWQgbGVmdHJvdGF0ZShzdHJ1Y3QgdHJlZSpULCBzdHJ1Y3QgdG5vZGUqeCkKewoJc3RydWN0IHRub2RlICogeTsKCXk9KHN0cnVjdCB0bm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKCXk9VC0+bmlsOyAKCWlmKHgtPnJpZ2h0Q2hpbGQ9PU5VTEwpCglyZXR1cm47CgkKCXk9eC0+cmlnaHRDaGlsZDsKCXgtPnJpZ2h0Q2hpbGQ9eS0+bGVmdENoaWxkOwoJaWYoeS0+bGVmdENoaWxkIT1ULT5uaWwpCgkJeS0+bGVmdENoaWxkLT5wYXJlbnQ9eDsKCXktPnBhcmVudD14LT5wYXJlbnQ7CglpZih4LT5wYXJlbnQ9PVQtPm5pbCkKCQlULT5yb290PXk7CgllbHNlIGlmICh4PT14LT5wYXJlbnQtPmxlZnRDaGlsZCkKCQl4LT5wYXJlbnQtPmxlZnRDaGlsZD15OwoJZWxzZSAKCQl4LT5wYXJlbnQtPnJpZ2h0Q2hpbGQ9eTsKCQoJeS0+bGVmdENoaWxkPXg7Cgl4LT5wYXJlbnQ9eTsgCn0Kdm9pZCByaWdodHJvdGF0ZShzdHJ1Y3QgdHJlZSpULCBzdHJ1Y3QgdG5vZGUqeCkKewoJc3RydWN0IHRub2RlICogeTsKCXk9KHN0cnVjdCB0bm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKCXk9eC0+bGVmdENoaWxkOwoJeC0+bGVmdENoaWxkPXktPnJpZ2h0Q2hpbGQ7CgkKCWlmKHktPnJpZ2h0Q2hpbGQhPVQtPm5pbCkKCXktPnJpZ2h0Q2hpbGQtPnBhcmVudD14OwoJeS0+cGFyZW50ID0geC0+cGFyZW50OwoJaWYgKCB4LT5wYXJlbnQgPT0gVC0+bmlsKQoJVC0+cm9vdCA9IHk7CgllbHNlIGlmICh4PT14LT5wYXJlbnQtPnJpZ2h0Q2hpbGQpCgkJeC0+cGFyZW50LT5yaWdodENoaWxkPXk7CgllbHNlIAoJCXgtPnBhcmVudC0+bGVmdENoaWxkPXk7CgkKCXktPnJpZ2h0Q2hpbGQ9eDsKCXgtPnBhcmVudD15OyAKfQp2b2lkIHJiaW5zZXJ0Zml4dXAoc3RydWN0IHRyZWUqVCwgc3RydWN0IHRub2RlKnopCnsKCXN0cnVjdCB0bm9kZSp5OwoJeT0oc3RydWN0IHRub2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCB0bm9kZSkpOwoJc3RydWN0IHRub2RlKng7Cgl4PShzdHJ1Y3QgdG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRub2RlKSk7CglpZihULT5yb290PT16KQoJewoJCXotPmNvbG9yPSdCJzsKCQlyZXR1cm47Cgl9CgkKCXdoaWxlKHotPnBhcmVudCE9TlVMTCAmJiB6LT5wYXJlbnQtPmNvbG9yPT0nUicpCgl7CgkJCgkJeT16LT5wYXJlbnQtPnBhcmVudDsKCQlpZih5LT5sZWZ0Q2hpbGQ9PXotPnBhcmVudCkKCQl7CgkJCQlpZih5LT5yaWdodENoaWxkIT1OVUxMKQoJCQkJewoJCQkJeD15LT5yaWdodENoaWxkOwoJCQkJaWYoeC0+Y29sb3I9PSdSJykKCQkJCQl7CgkJCQkJei0+cGFyZW50LT5jb2xvcj0nQic7CgkJCQkJeC0+Y29sb3I9J0InOwoJCQkJCXktPmNvbG9yPSdSJzsKCQkJCQl6PXk7CgkJCQkJfQoJCQkJfQoJCQkJZWxzZSAKCQkJCXsKCQkJCQlpZih6LT5wYXJlbnQtPnJpZ2h0Q2hpbGQ9PXopCgkJCQkJewoJCQkJCQl6PXotPnBhcmVudDsKCQkJCQkJbGVmdHJvdGF0ZShULHopOwoJCQkJCX0KCQkJCQl6LT5wYXJlbnQtPmNvbG9yPSdCJzsKCQkJCQl5LT5jb2xvcj0nUic7CgkJCQkJcmlnaHRyb3RhdGUoVCx5KTsKCQkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJaWYoeS0+bGVmdENoaWxkIT1OVUxMKQoJCQkJewoJCQkJeD15LT5sZWZ0Q2hpbGQ7CgkJCQlpZih4LT5jb2xvcj09J1InKQoJCQkJCXsKCQkJCQl6LT5wYXJlbnQtPmNvbG9yPSdCJzsKCQkJCQl4LT5jb2xvcj0nQic7CgkJCQkJeS0+Y29sb3I9J1InOwoJCQkJCXo9eTsKCQkJCQl9CgkJCQl9CgkJCQllbHNlIAoJCQkJewoJCQkJCWlmKHotPnBhcmVudC0+bGVmdENoaWxkPT16KQoJCQkJCXsKCQkJCQkJej16LT5wYXJlbnQ7CgkJCQkJCXJpZ2h0cm90YXRlKFQseik7CgkJCQkJfQoJCQkJCXotPnBhcmVudC0+Y29sb3I9J0InOwoJCQkJCXktPmNvbG9yPSdSJzsKCQkJCQlsZWZ0cm90YXRlKFQseSk7CgkJCQl9CgkJfQoJCVQtPnJvb3QtPmNvbG9yPSdCJzsKICB9Cn0KCnZvaWQgaW5zZXJ0aW9uKHN0cnVjdCB0cmVlICpULCBzdHJ1Y3QgdG5vZGUgKnopCnsKCQoJc3RydWN0IHRub2RlICogeTsKCXk9KHN0cnVjdCB0bm9kZSopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdG5vZGUpKTsKCXN0cnVjdCB0bm9kZSAqIHg7Cgl4PShzdHJ1Y3QgdG5vZGUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRub2RlKSk7Cgl5PVQtPm5pbDsgCgl4PVQtPnJvb3Q7CglpZihULT5yb290PT1OVUxMKQoJewoJCVQtPnJvb3Q9ejsKCQl6LT5wYXJlbnQ9TlVMTDsKCX0KCWVsc2UKCXsKCQoJd2hpbGUoeCE9VC0+bmlsKQoJewoJCXk9eDsKCQlpZih6LT5kYXRhIDwgeC0+ZGF0YSkKCQl4PXgtPmxlZnRDaGlsZDsKCQllbHNlIAoJCXg9eC0+cmlnaHRDaGlsZDsKCX0KCXotPnBhcmVudD15OwoJaWYoeT09VC0+bmlsKQoJVC0+cm9vdD16OwoJZWxzZSBpZiAoei0+ZGF0YTwgeS0+ZGF0YSkKCXktPmxlZnRDaGlsZD16OwoJZWxzZQoJeS0+cmlnaHRDaGlsZD16OwoJCi8vCXotPmxlZnRDaGlsZD1ULT5uaWw7Ci8vLwl6LT5yaWdodENoaWxkPVQtPm5pbDsKLy8Jei0+Y29sb3I9J1InOwp9CglpZih6LT5wYXJlbnQhPU5VTEwpCgl7CgkJaWYoei0+cGFyZW50LT5wYXJlbnQ9PU5VTEwpCgkJei0+cGFyZW50LT5jb2xvcj0nQic7CgkJZWxzZSAKCQlyYmluc2VydGZpeHVwKFQseik7Cgl9CglULT5yb290LT5jb2xvcj0nQic7CgkKfQoKdm9pZCB2aXNpdChzdHJ1Y3QgdG5vZGUqIHgpCnsKCWlmKHghPU5VTEwpCgl7CgkJdmlzaXQoeC0+bGVmdENoaWxkKTsKCQlpZih4LT5wYXJlbnQhPU5VTEwpCgkJcHJpbnRmKCIlZCAlYyAlZCBcbiIsIHgtPmRhdGEsIHgtPmNvbG9yLCB4LT5wYXJlbnQtPmRhdGEpOwoJCWVsc2UKCQlwcmludGYoIiVkICVjIE5JTCBcbiIsIHgtPmRhdGEsIHgtPmNvbG9yKTsKCQkJCgkJdmlzaXQoeC0+cmlnaHRDaGlsZCk7Cgl9Cn0Kdm9pZCBwcmVfZml4X3RvdXIgKHN0cnVjdCB0cmVlKiBUKQp7CglpZihULT5yb290PT1OVUxMKQoJcHJpbnRmKCJlbXB0eSB0cmVlIik7CgllbHNlCgl2aXNpdChULT5yb290KTsKCQp9CgoKaW50IG1haW4oKQp7CgkvL2ludCBhW109ezUsNCwxLDYsMTAsMTF9OwoJaW50IGk7IGludCBuOwoJc2NhbmYoIiVkIiwgJm4pOwoJaW50IGFbbl07Cglmb3IoaT0wO2k8bjtpKyspCglzY2FuZigiJWQgIiwgJmFbaV0pOwoJCglzdHJ1Y3QgdG5vZGUqIG5vZGU7CglzdHJ1Y3QgdHJlZSAqdHJlZW47Cgl0cmVlbj0oc3RydWN0IHRyZWUqKW1hbGxvYyhzaXplb2Yoc3RydWN0IHRyZWUpKTsKCXRyZWVuLT5uaWw9TlVMTDsKCXRyZWVuLT5yb290PU5VTEw7Cglmb3IoaT0wO2k8bjtpKyspCgl7CgkJbm9kZT1jcmVhdGVub2RlKGFbaV0pOwoJCWluc2VydGlvbih0cmVlbiwgbm9kZSk7Cgl9CgkKcHJlX2ZpeF90b3VyKHRyZWVuKTsKCQoJcmV0dXJuIDA7CgkKCQoJCn0=