/**
* Binary Search Tree - BST non-recursive solution
* -----------------------------------------------
*
* Methods:
* -------
* add
* search
* delete
*
* inorder
* postorder
* inorder
*/
#include <stdio.h>
#include <malloc.h>
struct Node {
int data;
struct Node *left;
struct Node *right;
};
struct Node *root=NULL;
void add(int);
void inorder(struct Node*);
void preorder(struct Node*);
void postorder(struct Node*);
int search(int);
void delete(int);
int main() {
int node;
int whatsearch;
add(8);
add(3);
add(10);
add(1);
add(2);
add(14);
add(11);
add(6);
add(4);
add(7);
postorder(root);
if(search(whatsearch)) {
printf("The node %d exists in Tree \n",whatsearch
);
} else {
printf("The node %d not exist in Tree \n",whatsearch
); }
printf("Give me a node to remove NODE=");
printf("\nTrying to remove the node=%d", node
); delete(node);
//Traversals
postorder(root);
inorder(root);
preorder(root);
//return SUCCESS to the Operating System
return (0);
};
void add (int val) {
struct Node *curr, *new;
if(root == NULL) {
root
= (struct Node
*) malloc(sizeof(struct Node
));
root->data = val;
root->left = NULL;
root->right = NULL;
} else {
curr = root;
while(1) {
if(val < curr->data) {
if(curr->left) {
curr = curr->left;
} else {
new
= (struct Node
*) malloc(sizeof(struct Node
));
new->data = val;
new->left = NULL;
new->right = NULL;
curr->left = new;
break;
}
} else {
if(curr->right) {
curr = curr->right;
} else {
new
= (struct Node
*) malloc(sizeof(struct Node
));
new->data = val;
new->left = NULL;
new->right = NULL;
curr->right = new;
break;
}
}
}
}
};
void postorder(struct Node* node) {
if(node->left) {
postorder(node->left);
}
if(node->right) {
postorder(node->right);
}
};
void inorder(struct Node* node) {
if(node->left) {
inorder(node->left);
}
if(node->right) {
inorder(node->right);
}
};
void preorder(struct Node* node) {
if(node->left) {
preorder(node->left);
}
if(node->right) {
preorder(node->right);
}
};
int search(int val) {
struct Node *curr = root;
int found = 0;
while(!found && curr) {
if(curr->data == val) {
found = 1;
} else {
if(val < curr->data) {
curr = curr->left;
} else {
curr = curr->right;
}
}
}
return found;
}
void delete(int val) {
struct Node *curr = root, *parrent, *next;
int found = 0;
while(!found && curr) {
if(curr->data == val) {
found = 1;
} else {
if(val < curr->data) {
parrent = curr;
curr = curr->left;
} else {
parrent = curr;
curr = curr->right;
}
}
}
if( found ) {
if(curr->left == NULL && curr->right == NULL) {
if(parrent->data < curr->data) parrent->right = NULL;
else parrent->left = NULL;
} else if(curr->left == NULL && curr->right != NULL) {
//for debug
//printf("node=%d parent=%d",curr->data, parrent->data);
next = curr->right;
if(parrent->data < curr->data) parrent->right = next;
else parrent->left = next;
} else if(curr->left != NULL && curr->right == NULL) {
//for debug
//printf("node=%d parent=%d",curr->data, parrent->data);
next = curr->left;
if(parrent->data < curr->data) parrent->right = next;
else parrent->left = next;
} else if(curr->left != NULL && curr->right != NULL) {
struct Node *p,*c;
//if the node has left subtree and rightsubtree then trying to find out the mostly right from left subtree
c = curr->left;
while(c->right) {
p = c;
c=c->right;
}
//for debug
//printf("node=%d parrent=%d",c->data,p->data);
curr->data = c->data;
next = c->left;
if(p->data < c->data) p->right = next;
else p->left = next;
}
printf("\nThe node is removed\n");
} else {
}
}
LyoqCiAqICBCaW5hcnkgU2VhcmNoIFRyZWUgLSBCU1Qgbm9uLXJlY3Vyc2l2ZSBzb2x1dGlvbgogKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICoKICogIE1ldGhvZHM6CiAqICAtLS0tLS0tCiAqICBhZGQKICogIHNlYXJjaAogKiAgZGVsZXRlCiAqICAgCiAqICBpbm9yZGVyCiAqICBwb3N0b3JkZXIKICogIGlub3JkZXIKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgoKc3RydWN0IE5vZGUgewoKICAgICAgIGludCBkYXRhOwogICAgICAgc3RydWN0IE5vZGUgKmxlZnQ7CiAgICAgICBzdHJ1Y3QgTm9kZSAqcmlnaHQ7Cn07CgpzdHJ1Y3QgTm9kZSAqcm9vdD1OVUxMOwoKdm9pZCBhZGQoaW50KTsKdm9pZCBpbm9yZGVyKHN0cnVjdCBOb2RlKik7CnZvaWQgcHJlb3JkZXIoc3RydWN0IE5vZGUqKTsKdm9pZCBwb3N0b3JkZXIoc3RydWN0IE5vZGUqKTsKaW50ICBzZWFyY2goaW50KTsKdm9pZCBkZWxldGUoaW50KTsKCmludCBtYWluKCkgewogICAgaW50IG5vZGU7CiAgICBpbnQgd2hhdHNlYXJjaDsgCgogICAgYWRkKDgpOwogICAgYWRkKDMpOwogICAgYWRkKDEwKTsKICAgIGFkZCgxKTsKICAgIGFkZCgyKTsKICAgIGFkZCgxNCk7CiAgICBhZGQoMTEpOwogICAgYWRkKDYpOwogICAgYWRkKDQpOwogICAgYWRkKDcpOyAgICAgCgogICAgcG9zdG9yZGVyKHJvb3QpOwoKICAgIHByaW50ZigiXG5Ob2RlIHRvIHNlYXJjaD0iKTsKICAgIHNjYW5mKCIlZCIsJndoYXRzZWFyY2gpOwogCiAgICBpZihzZWFyY2god2hhdHNlYXJjaCkpIHsKCiAgICAgICBwcmludGYoIlRoZSBub2RlICVkIGV4aXN0cyBpbiBUcmVlIFxuIix3aGF0c2VhcmNoKTsKCiAgICB9IGVsc2UgewoKICAgICAgIHByaW50ZigiVGhlIG5vZGUgJWQgbm90IGV4aXN0IGluIFRyZWUgXG4iLHdoYXRzZWFyY2gpOwogICAgfQoKICAgIHByaW50ZigiR2l2ZSBtZSBhIG5vZGUgdG8gcmVtb3ZlIE5PREU9Iik7CiAgICBzY2FuZigiJWQiLCZub2RlKTsKCiAgICBwcmludGYoIlxuVHJ5aW5nIHRvIHJlbW92ZSB0aGUgbm9kZT0lZCIsIG5vZGUpOwogICAgZGVsZXRlKG5vZGUpOwoKICAgIC8vVHJhdmVyc2FscwogICAgcHJpbnRmKCJcblxuUG9zdG9yZGVyOlxuIik7CiAgICBwb3N0b3JkZXIocm9vdCk7ICAgIAogICAgcHJpbnRmKCJcbklub3JkZXI6XG4iKTsKICAgIGlub3JkZXIocm9vdCk7ICAgIAogICAgcHJpbnRmKCJcblByZW9yZGVyOlxuIik7CiAgICBwcmVvcmRlcihyb290KTsgICAgCgoKICAgIC8vcmV0dXJuIFNVQ0NFU1MgdG8gdGhlIE9wZXJhdGluZyBTeXN0ZW0KICAgIHJldHVybiAoMCk7ICAKfTsKCnZvaWQgYWRkIChpbnQgdmFsKSB7CgogICAgIHN0cnVjdCBOb2RlICpjdXJyLCAqbmV3OwoKICAgICBpZihyb290ID09IE5VTEwpIHsKCiAgICAgICAgcm9vdCA9IChzdHJ1Y3QgTm9kZSopIG1hbGxvYyhzaXplb2Yoc3RydWN0IE5vZGUpKTsKIAogICAgICAgIHJvb3QtPmRhdGEgPSB2YWw7CgogICAgICAgIHJvb3QtPmxlZnQgPSBOVUxMOwoKICAgICAgICByb290LT5yaWdodCA9IE5VTEw7CiAKICAgICB9IGVsc2UgewoKICAgICAgIGN1cnIgPSByb290OwoKICAgICAgIHdoaWxlKDEpIHsKCiAgICAgICAgICAgIGlmKHZhbCA8IGN1cnItPmRhdGEpIHsKCiAgICAgICAgICAgICAgIGlmKGN1cnItPmxlZnQpIHsKCiAgICAgICAgICAgICAgICAgY3VyciA9IGN1cnItPmxlZnQ7CgogICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgIG5ldyA9IChzdHJ1Y3QgTm9kZSopIG1hbGxvYyhzaXplb2Yoc3RydWN0IE5vZGUpKTsgICAgICAgICAgICAgCgogICAgICAgICAgICAgICAgIG5ldy0+ZGF0YSA9IHZhbDsKCiAgICAgICAgICAgICAgICAgbmV3LT5sZWZ0ID0gTlVMTDsKCiAgICAgICAgICAgICAgICAgbmV3LT5yaWdodCA9IE5VTEw7IAoKICAgICAgICAgICAgICAgICBjdXJyLT5sZWZ0ID0gbmV3OwoKICAgICAgICAgICAgICAgICBicmVhazsgCiAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICBpZihjdXJyLT5yaWdodCkgewoKICAgICAgICAgICAgICAgICBjdXJyID0gY3Vyci0+cmlnaHQ7CgogICAgICAgICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgICAgICBuZXcgPSAoc3RydWN0IE5vZGUqKSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7ICAgICAgICAgICAgIAoKICAgICAgICAgICAgICAgICBuZXctPmRhdGEgPSB2YWw7CgogICAgICAgICAgICAgICAgIG5ldy0+bGVmdCA9IE5VTEw7CgogICAgICAgICAgICAgICAgIG5ldy0+cmlnaHQgPSBOVUxMOyAKCiAgICAgICAgICAgICAgICAgY3Vyci0+cmlnaHQgPSBuZXc7CgogICAgICAgICAgICAgICAgIGJyZWFrOyAKICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IAogICAgICAgfSAgICAgCiAgICAgfQp9OwoKdm9pZCBwb3N0b3JkZXIoc3RydWN0IE5vZGUqIG5vZGUpIHsKCiAgICBpZihub2RlLT5sZWZ0KSB7CgogICAgICAgcG9zdG9yZGVyKG5vZGUtPmxlZnQpOwogICAgfSAKCiAgICBpZihub2RlLT5yaWdodCkgewoKICAgICAgIHBvc3RvcmRlcihub2RlLT5yaWdodCk7CiAgICB9IAoKICAgIHByaW50ZigiJWQgIixub2RlLT5kYXRhKTsgICAKCn07Cgp2b2lkIGlub3JkZXIoc3RydWN0IE5vZGUqIG5vZGUpIHsKCiAgICBpZihub2RlLT5sZWZ0KSB7CgogICAgICAgaW5vcmRlcihub2RlLT5sZWZ0KTsKICAgIH0gCgogICAgcHJpbnRmKCIlZCAiLG5vZGUtPmRhdGEpOyAgIAoKICAgIGlmKG5vZGUtPnJpZ2h0KSB7CgogICAgICAgaW5vcmRlcihub2RlLT5yaWdodCk7CiAgICB9IAoKfTsKCgp2b2lkIHByZW9yZGVyKHN0cnVjdCBOb2RlKiBub2RlKSB7CgogICAgcHJpbnRmKCIlZCAiLG5vZGUtPmRhdGEpOyAgIAoKICAgIGlmKG5vZGUtPmxlZnQpIHsKCiAgICAgICBwcmVvcmRlcihub2RlLT5sZWZ0KTsKICAgIH0gCgogICAgaWYobm9kZS0+cmlnaHQpIHsKCiAgICAgICBwcmVvcmRlcihub2RlLT5yaWdodCk7CiAgICB9IAp9OwoKCmludCBzZWFyY2goaW50IHZhbCkgewoKICAgIHN0cnVjdCBOb2RlICpjdXJyID0gcm9vdDsKCiAgICBpbnQgZm91bmQgPSAwOwoKICAgIHdoaWxlKCFmb3VuZCAmJiBjdXJyKSB7CgogICAgICAgICBpZihjdXJyLT5kYXRhID09IHZhbCkgewoKICAgICAgICAgICAgZm91bmQgPSAxOwoKICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgIGlmKHZhbCA8IGN1cnItPmRhdGEpIHsKCiAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLT5sZWZ0OwoKICAgICAgICAgICAgfSBlbHNlIHsKCiAgICAgICAgICAgICAgIGN1cnIgPSBjdXJyLT5yaWdodDsKICAgICAgICAgICAgfSAgCgogICAgICAgICB9IAogICAgfSAgICAgICAKCiAgIHJldHVybiBmb3VuZDsKfQoKdm9pZCBkZWxldGUoaW50IHZhbCkgewoKICAgIHN0cnVjdCBOb2RlICpjdXJyID0gcm9vdCwgKnBhcnJlbnQsICpuZXh0OwoKICAgIGludCBmb3VuZCA9IDA7CgogICAgd2hpbGUoIWZvdW5kICYmIGN1cnIpIHsKCiAgICAgICAgIGlmKGN1cnItPmRhdGEgPT0gdmFsKSB7CgogICAgICAgICAgICBmb3VuZCA9IDE7CgogICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgaWYodmFsIDwgY3Vyci0+ZGF0YSkgewoKICAgICAgICAgICAgICAgcGFycmVudCA9IGN1cnI7CgogICAgICAgICAgICAgICBjdXJyID0gY3Vyci0+bGVmdDsKCiAgICAgICAgICAgIH0gZWxzZSB7CgogICAgICAgICAgICAgICBwYXJyZW50ID0gY3VycjsKIAogICAgICAgICAgICAgICBjdXJyID0gY3Vyci0+cmlnaHQ7CiAgICAgICAgICAgIH0gIAoKICAgICAgICAgfSAKICAgIH0gICAgICAgCgoKICAgIGlmKCBmb3VuZCApIHsKCiAgICAgICBpZihjdXJyLT5sZWZ0ID09IE5VTEwgJiYgY3Vyci0+cmlnaHQgPT0gTlVMTCkgewogICAgICAgICAKICAgICAgICAgIGlmKHBhcnJlbnQtPmRhdGEgPCBjdXJyLT5kYXRhKSBwYXJyZW50LT5yaWdodCA9IE5VTEw7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHBhcnJlbnQtPmxlZnQgPSBOVUxMOwoKICAgICAgICAgIGZyZWUoY3Vycik7CiAgICAgICAgICAgICAgICAgICAgICAKICAgICAgIH0gZWxzZSBpZihjdXJyLT5sZWZ0ID09IE5VTEwgJiYgY3Vyci0+cmlnaHQgIT0gTlVMTCkgewoKICAgICAgICAgIC8vZm9yIGRlYnVnCiAgICAgICAgICAvL3ByaW50Zigibm9kZT0lZCBwYXJlbnQ9JWQiLGN1cnItPmRhdGEsIHBhcnJlbnQtPmRhdGEpOyAgCgogICAgICAgICAgbmV4dCA9IGN1cnItPnJpZ2h0OwoKICAgICAgICAgIGlmKHBhcnJlbnQtPmRhdGEgPCBjdXJyLT5kYXRhKSBwYXJyZW50LT5yaWdodCA9IG5leHQ7CgogICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHBhcnJlbnQtPmxlZnQgPSBuZXh0OwogICAgICAgICAgZnJlZShjdXJyKTsKCiAgICAgICB9IGVsc2UgaWYoY3Vyci0+bGVmdCAhPSBOVUxMICYmIGN1cnItPnJpZ2h0ID09IE5VTEwpIHsKCiAgICAgICAgIC8vZm9yIGRlYnVnIAogICAgICAgICAvL3ByaW50Zigibm9kZT0lZCBwYXJlbnQ9JWQiLGN1cnItPmRhdGEsIHBhcnJlbnQtPmRhdGEpOwoKICAgICAgICAgbmV4dCA9IGN1cnItPmxlZnQ7CgogICAgICAgICBpZihwYXJyZW50LT5kYXRhIDwgY3Vyci0+ZGF0YSkgcGFycmVudC0+cmlnaHQgPSBuZXh0OwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgIHBhcnJlbnQtPmxlZnQgPSBuZXh0OwogICAgICAgICBmcmVlKGN1cnIpOwoKICAgICAgIH0gZWxzZSBpZihjdXJyLT5sZWZ0ICE9IE5VTEwgJiYgY3Vyci0+cmlnaHQgIT0gTlVMTCkgewogICAgICAgIAogICAgICAgICAgICAgICBzdHJ1Y3QgTm9kZSAqcCwqYzsKCiAgICAgICAgICAgICAgIC8vaWYgdGhlIG5vZGUgaGFzIGxlZnQgc3VidHJlZSBhbmQgcmlnaHRzdWJ0cmVlIHRoZW4gdHJ5aW5nIHRvIGZpbmQgb3V0IHRoZSBtb3N0bHkgcmlnaHQgZnJvbSBsZWZ0IHN1YnRyZWUKICAgICAgICAgICAgICAgYyA9IGN1cnItPmxlZnQ7CgogICAgICAgICAgICAgICB3aGlsZShjLT5yaWdodCkgewoKICAgICAgICAgICAgICAgICAgICAgcCA9IGM7CgogICAgICAgICAgICAgICAgICAgICBjPWMtPnJpZ2h0OwogICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAvL2ZvciBkZWJ1ZwogICAgICAgICAgICAgICAvL3ByaW50Zigibm9kZT0lZCBwYXJyZW50PSVkIixjLT5kYXRhLHAtPmRhdGEpOwogICAgCiAgICAgICAgICAgICAgIGN1cnItPmRhdGEgPSBjLT5kYXRhOwoKICAgICAgICAgICAgICAgbmV4dCA9IGMtPmxlZnQ7CgogICAgICAgICAgICAgICBpZihwLT5kYXRhIDwgYy0+ZGF0YSkgcC0+cmlnaHQgPSBuZXh0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAgICAgcC0+bGVmdCA9IG5leHQ7CgogICAgICAgICAgICAgICBmcmVlKGMpOyAgCiAgICAgICB9CgogICAgICAgICAKICAgIHByaW50ZigiXG5UaGUgbm9kZSBpcyByZW1vdmVkXG4iKTsgICAgICAgIAoKICAgIH0gZWxzZSB7CgogICAgICAgcHJpbnRmKCJcbk5vZGUgbm90IGZvdW5kISIpOwogICAgfSAKfQ==