#include <stdio.h>
#include <stdlib.h>
enum nodeColor {
RED,
BLACK
};
struct rbNode {
int data, color;
struct rbNode *link[3];
};
struct rbNode *root = NULL;
struct rbNode * createNode(int data) {
struct rbNode *newnode;
newnode
= (struct rbNode
*)malloc(sizeof(struct rbNode
)); newnode->data = data;
newnode->color = RED;
newnode->link[0] = newnode->link[1]=newnode->link[2] = NULL;
return newnode;
}
void insertion (int data) {
struct rbNode *stack[98],*zptr, *ptr, *newnode, *xPtr, *yPtr,*a;
int dir[98], ht = 0, index;
ptr = root;
if (!root) {
root = createNode(data);
return;
}
stack[ht] = root;
dir[ht++] = 0;
/* find the place to insert the new node */
while (ptr != NULL) {
if (ptr->data == data) {
printf("Duplicates Not Allowed!!\n"); return;
}
index = (data - ptr->data) > 0 ? 1 : 0;
a=ptr->data;
stack[ht] = ptr;
ptr = ptr->link[index];
ptr->link[2]=a;
dir[ht++] = index;
}
/* insert the new node */
stack[ht - 1]->link[index] = newnode = createNode(data);
while ((ht >= 3) && (stack[ht - 1]->color == RED)) {
if (dir[ht - 2] == 0) {
yPtr = stack[ht - 2]->link[1];
if (yPtr != NULL && yPtr->color == RED) {
stack[ht - 2]->color = RED;
stack[ht - 1]->color = yPtr->color = BLACK;
ht = ht -2;
} else {
if (dir[ht - 1] == 0) {
yPtr = stack[ht - 1];
} else {
xPtr = stack[ht - 1];
yPtr = xPtr->link[1];
yPtr->link[0]->link[2]=xPtr;
xPtr->link[1] = yPtr->link[0];
yPtr->link[0] = xPtr;
stack[ht - 2]->link[0] = yPtr;
zptr=xPtr->link[2];
xPtr->link[2]=yPtr;
yPtr->link[2]=zptr;
}
xPtr = stack[ht - 2];
xPtr->color = RED;
yPtr->color = BLACK;
yPtr->link[0]->link[2]=xPtr;
xPtr->link[0] = yPtr->link[1];
zptr=xPtr->link[2];
yPtr->link[1] = xPtr;
xPtr->link[2]=yPtr;
if (xPtr == root) {
root = yPtr;
yPtr->link[2]=NULL;
} else {
stack[ht - 3]->link[dir[ht - 3]] = yPtr;
yPtr->link[2]=zptr;
}
break;
}
} else {
yPtr = stack[ht - 2]->link[0];
if ((yPtr != NULL) && (yPtr->color == RED)) {
stack[ht - 2]->color = RED;
stack[ht - 1]->color = yPtr->color = BLACK;
ht = ht - 2;
} else {
if (dir[ht - 1] == 1) {
yPtr = stack[ht - 1];
} else {
xPtr = stack[ht - 1];
yPtr = xPtr->link[0];
yPtr->link[0]->link[2]=xPtr;
xPtr->link[0] = yPtr->link[1];
zptr=xPtr->link[2];
yPtr->link[1] = xPtr;
xPtr->link[2]=yPtr;
yPtr->link[2]=zptr;
stack[ht - 2]->link[1] = yPtr;
}
xPtr = stack[ht - 2];
yPtr->color = BLACK;
xPtr->color = RED;
yPtr->link[0]->link[2]=xPtr;
xPtr->link[1] = yPtr->link[0];
zptr=xPtr->link[2];
yPtr->link[0] = xPtr;
xPtr->link[2]=yPtr;
if (xPtr == root) {
root = yPtr;
yPtr->link[2]=NULL;
} else {
stack[ht - 3]->link[dir[ht - 3]] = yPtr;
yPtr->link[2]=zptr;
}
break;
}
}
}
root->color = BLACK;
}
void print(struct rbNode * root)
{
if (root != NULL)
{
print(root->link[0]);
printf("%d %s ", root
->data
, root
->color
); if (root->link[2] == NULL)
{
}
else
{
printf("%d\n", (root
->link
[2])->data
); }
print(root->link[1]);
}
return;
}
int main() {
int n,i;
int a=n;
int ar[n];
for (i=0;i<a;i++){
insertion(ar[i]);
}
print(root);
return 0;
}
ICAjaW5jbHVkZSA8c3RkaW8uaD4KICAjaW5jbHVkZSA8c3RkbGliLmg+CiAgCiAgZW51bSBub2RlQ29sb3IgewogICAgICAgIFJFRCwKICAgICAgICBCTEFDSwogIH07CgogIHN0cnVjdCByYk5vZGUgewogICAgICAgIGludCBkYXRhLCBjb2xvcjsKICAgICAgICBzdHJ1Y3QgcmJOb2RlICpsaW5rWzNdOwogIH07CgogIHN0cnVjdCByYk5vZGUgKnJvb3QgPSBOVUxMOwoKICBzdHJ1Y3QgcmJOb2RlICogY3JlYXRlTm9kZShpbnQgZGF0YSkgewogICAgICAgIHN0cnVjdCByYk5vZGUgKm5ld25vZGU7CiAgICAgICAgbmV3bm9kZSA9IChzdHJ1Y3QgcmJOb2RlICopbWFsbG9jKHNpemVvZihzdHJ1Y3QgcmJOb2RlKSk7CiAgICAgICAgbmV3bm9kZS0+ZGF0YSA9IGRhdGE7CiAgICAgICAgbmV3bm9kZS0+Y29sb3IgPSBSRUQ7CiAgICAgICAgbmV3bm9kZS0+bGlua1swXSA9IG5ld25vZGUtPmxpbmtbMV09bmV3bm9kZS0+bGlua1syXSA9IE5VTEw7CiAgICAgICAgcmV0dXJuIG5ld25vZGU7CiAgfQoKICB2b2lkIGluc2VydGlvbiAoaW50IGRhdGEpIHsKICAgICAgICBzdHJ1Y3QgcmJOb2RlICpzdGFja1s5OF0sKnpwdHIsICpwdHIsICpuZXdub2RlLCAqeFB0ciwgKnlQdHIsKmE7CiAgICAgICAgaW50IGRpcls5OF0sIGh0ID0gMCwgaW5kZXg7CiAgICAgICAgcHRyID0gcm9vdDsKICAgICAgICBpZiAoIXJvb3QpIHsKICAgICAgICAgICAgICAgIHJvb3QgPSBjcmVhdGVOb2RlKGRhdGEpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBzdGFja1todF0gPSByb290OwogICAgICAgIGRpcltodCsrXSA9IDA7CiAgICAgICAgLyogZmluZCB0aGUgcGxhY2UgdG8gaW5zZXJ0IHRoZSBuZXcgbm9kZSAqLwogICAgICAgIHdoaWxlIChwdHIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKHB0ci0+ZGF0YSA9PSBkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRHVwbGljYXRlcyBOb3QgQWxsb3dlZCEhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW5kZXggPSAoZGF0YSAtIHB0ci0+ZGF0YSkgPiAwID8gMSA6IDA7CiAgICAgICAgICAgICAgICBhPXB0ci0+ZGF0YTsKICAgICAgICAgICAgICAgIHN0YWNrW2h0XSA9IHB0cjsKICAgICAgICAgICAgICAgIHB0ciA9IHB0ci0+bGlua1tpbmRleF07CiAgICAgICAgICAgICAgICBwdHItPmxpbmtbMl09YTsKICAgICAgICAgICAgICAgIGRpcltodCsrXSA9IGluZGV4OwoKICAgICAgICB9CiAgICAgICAgLyogaW5zZXJ0IHRoZSBuZXcgbm9kZSAqLwogICAgICAgIHN0YWNrW2h0IC0gMV0tPmxpbmtbaW5kZXhdID0gbmV3bm9kZSA9IGNyZWF0ZU5vZGUoZGF0YSk7CiAgICAgICAgd2hpbGUgKChodCA+PSAzKSAmJiAoc3RhY2tbaHQgLSAxXS0+Y29sb3IgPT0gUkVEKSkgewogICAgICAgICAgICAgICAgaWYgKGRpcltodCAtIDJdID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgeVB0ciA9IHN0YWNrW2h0IC0gMl0tPmxpbmtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh5UHRyICE9IE5VTEwgJiYgeVB0ci0+Y29sb3IgPT0gUkVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbaHQgLSAyXS0+Y29sb3IgPSBSRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbaHQgLSAxXS0+Y29sb3IgPSB5UHRyLT5jb2xvciA9IEJMQUNLOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0ID0gaHQgLTI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcltodCAtIDFdID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHIgPSBzdGFja1todCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQdHIgPSBzdGFja1todCAtIDFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ciA9IHhQdHItPmxpbmtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzBdLT5saW5rWzJdPXhQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UHRyLT5saW5rWzFdID0geVB0ci0+bGlua1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHItPmxpbmtbMF0gPSB4UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbaHQgLSAyXS0+bGlua1swXSA9IHlQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6cHRyPXhQdHItPmxpbmtbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UHRyLT5saW5rWzJdPXlQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzJdPXpwdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFB0ciA9IHN0YWNrW2h0IC0gMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFB0ci0+Y29sb3IgPSBSRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ci0+Y29sb3IgPSBCTEFDSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzBdLT5saW5rWzJdPXhQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFB0ci0+bGlua1swXSA9IHlQdHItPmxpbmtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenB0cj14UHRyLT5saW5rWzJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHItPmxpbmtbMV0gPSB4UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQdHItPmxpbmtbMl09eVB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeFB0ciA9PSByb290KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ID0geVB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHItPmxpbmtbMl09TlVMTDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tbaHQgLSAzXS0+bGlua1tkaXJbaHQgLSAzXV0gPSB5UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ci0+bGlua1syXT16cHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgeVB0ciA9IHN0YWNrW2h0IC0gMl0tPmxpbmtbMF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoeVB0ciAhPSBOVUxMKSAmJiAoeVB0ci0+Y29sb3IgPT0gUkVEKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW2h0IC0gMl0tPmNvbG9yID0gUkVEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW2h0IC0gMV0tPmNvbG9yID0geVB0ci0+Y29sb3IgPSBCTEFDSzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodCA9IGh0IC0gMjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGlyW2h0IC0gMV0gPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ciA9IHN0YWNrW2h0IC0gMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UHRyID0gc3RhY2tbaHQgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHIgPSB4UHRyLT5saW5rWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ci0+bGlua1swXS0+bGlua1syXT14UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFB0ci0+bGlua1swXSA9IHlQdHItPmxpbmtbMV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6cHRyPXhQdHItPmxpbmtbMl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzFdID0geFB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQdHItPmxpbmtbMl09eVB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHItPmxpbmtbMl09enB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrW2h0IC0gMl0tPmxpbmtbMV0gPSB5UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UHRyID0gc3RhY2tbaHQgLSAyXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5jb2xvciA9IEJMQUNLOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhQdHItPmNvbG9yID0gUkVEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlQdHItPmxpbmtbMF0tPmxpbmtbMl09eFB0cjsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFB0ci0+bGlua1sxXSA9IHlQdHItPmxpbmtbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgenB0cj14UHRyLT5saW5rWzJdOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzBdID0geFB0cjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4UHRyLT5saW5rWzJdPXlQdHI7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4UHRyID09IHJvb3QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSB5UHRyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeVB0ci0+bGlua1syXT1OVUxMOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1todCAtIDNdLT5saW5rW2RpcltodCAtIDNdXSA9IHlQdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5UHRyLT5saW5rWzJdPXpwdHI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJvb3QtPmNvbG9yID0gQkxBQ0s7CiAgfQoKICB2b2lkIHByaW50KHN0cnVjdCByYk5vZGUgKiByb290KQogIHsKICAJCWlmIChyb290ICE9IE5VTEwpCiAgCQl7CiAgCQkJcHJpbnQocm9vdC0+bGlua1swXSk7CiAgCQkJcHJpbnRmKCIlZCAlcyAiLCByb290LT5kYXRhLCByb290LT5jb2xvcik7CiAgCQkJaWYgKHJvb3QtPmxpbmtbMl0gPT0gTlVMTCkKICAJCQl7CiAgCQkJCXByaW50ZigiTklMXG4iKTsKICAJCQl9CiAgCQkJZWxzZQogIAkJCXsKICAJCQkJcHJpbnRmKCIlZFxuIiwgKHJvb3QtPmxpbmtbMl0pLT5kYXRhKTsKICAJCQl9CiAgCQkJcHJpbnQocm9vdC0+bGlua1sxXSk7CiAgCQl9CiAgCQlyZXR1cm47CiAgfQoKICBpbnQgbWFpbigpIHsKCWludCBuLGk7CglzY2FuZigiJWQiLCZuKTsKCWludCBhPW47CglpbnQgYXJbbl07Cglmb3IgKGk9MDtpPGE7aSsrKXsKCQlzY2FuZigiJWQiLCZhcltpXSk7CgkJaW5zZXJ0aW9uKGFyW2ldKTsKCX0KCQkKCXByaW50KHJvb3QpOwoJcmV0dXJuIDA7Cgp9Cg==