/*
Binary search tree Data Structure.
Methods:
- insert
- search
- delete
- traversals(preorder, inorder, postorder)
*/
#include <stdio.h>
#include <malloc.h>
struct Node {
int data;
struct Node *left;
struct Node *right;
};
struct Node *insert(struct Node *node, int data) {
if(node == NULL) {
node
= (struct Node
*)malloc(sizeof(struct Node
)); node->data = data;
node->left = NULL;
node->right = NULL;
} else {
if(node->data > data)
node->left = insert(node->left, data);
else
node->right = insert(node->right, data);
}
return node;
}
int search(struct Node *root, int data) {
if(root != NULL) {
if(root->data == data) {
return 1;
} else if(root->data > data) {
return search(root->left, data);
} else {
return search(root->right, data);
}
}
return 0;
}
void inorder(struct Node*root) {
if(root->left) {
inorder(root->left);
}
if(root->right) {
inorder(root->right);
}
}
struct Node *mostlyRightMin(struct Node *node) {
struct Node *curr = node;
//look down to find leftmost leaf
while(curr != NULL && curr->left!=NULL) {
curr = curr->left;
}
return curr;
}
struct Node *delete( struct Node*root, int key ) {
if( root == NULL ) return root;
if( root->data > key )
root->left = delete( root->left, key );
else if( root->data < key )
root->right = delete( root->right, key );
else {
if( root->left == NULL && root->right == NULL ) {
root = NULL;
} else if( root->left == NULL ) {
struct Node *temp = root;
root = root->right;
} else if( root-> right == NULL ) {
struct Node *temp = root;
root = root->left;
//we have both children: left and right
} else if(root->left != NULL && root->right != NULL) {
struct Node *p = mostlyRightMin(root->right);
root->data = p->data;
root->right = delete(root->right, p->data);
}
}
return root;
}
int main(int argc, char const *argv[]) {
struct Node *root = NULL;
root = insert(root, 8);
insert(root, 3);
insert(root, 10);
insert(root, 1);
insert(root, 6);
insert(root, 4);
insert(root, 7);
insert(root, 14);
insert(root, 13);
inorder(root);
int key = 3;
printf("\nDeleted Node = %d\n", key
); delete(root, key);
inorder(root);
return 0;
}
LyoKQmluYXJ5IHNlYXJjaCB0cmVlIERhdGEgU3RydWN0dXJlLgoKTWV0aG9kczoKICAtIGluc2VydAogIC0gc2VhcmNoCiAgLSBkZWxldGUKICAtIHRyYXZlcnNhbHMocHJlb3JkZXIsIGlub3JkZXIsIHBvc3RvcmRlcikKKi8KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCnN0cnVjdCBOb2RlIHsKCiAgICAgICBpbnQgZGF0YTsKICAgICAgIHN0cnVjdCBOb2RlICpsZWZ0OwogICAgICAgc3RydWN0IE5vZGUgKnJpZ2h0Owp9OwoKc3RydWN0IE5vZGUgKmluc2VydChzdHJ1Y3QgTm9kZSAqbm9kZSwgaW50IGRhdGEpIHsKCiAgICAgICBpZihub2RlID09IE5VTEwpIHsKCiAgICAgICAgICBub2RlID0gKHN0cnVjdCBOb2RlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBOb2RlKSk7CiAgICAgICAgICBub2RlLT5kYXRhID0gZGF0YTsKICAgICAgICAgIG5vZGUtPmxlZnQgPSBOVUxMOwogICAgICAgICAgbm9kZS0+cmlnaHQgPSBOVUxMOwoKICAgICAgIH0gZWxzZSB7CgogICAgICAgICBpZihub2RlLT5kYXRhID4gZGF0YSkKCiAgICAgICAgICAgbm9kZS0+bGVmdCA9IGluc2VydChub2RlLT5sZWZ0LCBkYXRhKTsKCiAgICAgICAgIGVsc2UKCiAgICAgICAgICAgbm9kZS0+cmlnaHQgPSBpbnNlcnQobm9kZS0+cmlnaHQsIGRhdGEpOwogICAgICAgfQoKICAgICAgIHJldHVybiBub2RlOwp9CgppbnQgc2VhcmNoKHN0cnVjdCBOb2RlICpyb290LCBpbnQgZGF0YSkgewoKICAgIGlmKHJvb3QgIT0gTlVMTCkgewoKICAgICAgaWYocm9vdC0+ZGF0YSA9PSBkYXRhKSB7CiAgICAgICAgcmV0dXJuIDE7CiAgICAgIH0gZWxzZSBpZihyb290LT5kYXRhID4gZGF0YSkgewogICAgICAgIHJldHVybiBzZWFyY2gocm9vdC0+bGVmdCwgZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHNlYXJjaChyb290LT5yaWdodCwgZGF0YSk7CiAgICAgIH0KCiAgICB9CiAgICByZXR1cm4gMDsKfQoKdm9pZCBpbm9yZGVyKHN0cnVjdCBOb2RlKnJvb3QpIHsKICAgICBpZihyb290LT5sZWZ0KSB7CiAgICAgICBpbm9yZGVyKHJvb3QtPmxlZnQpOwogICAgIH0KICAgICBwcmludGYoIiVkICIsIHJvb3QtPmRhdGEpOwogICAgIGlmKHJvb3QtPnJpZ2h0KSB7CiAgICAgICBpbm9yZGVyKHJvb3QtPnJpZ2h0KTsKICAgICB9Cn0KCnN0cnVjdCBOb2RlICptb3N0bHlSaWdodE1pbihzdHJ1Y3QgTm9kZSAqbm9kZSkgewoKICAgICAgICBzdHJ1Y3QgTm9kZSAqY3VyciA9IG5vZGU7CgogICAgICAgIC8vbG9vayBkb3duIHRvIGZpbmQgbGVmdG1vc3QgbGVhZgogICAgICAgIHdoaWxlKGN1cnIgIT0gTlVMTCAmJiBjdXJyLT5sZWZ0IT1OVUxMKSB7CiAgICAgICAgICBjdXJyID0gY3Vyci0+bGVmdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnI7Cn0KCnN0cnVjdCBOb2RlICpkZWxldGUoIHN0cnVjdCBOb2RlKnJvb3QsIGludCBrZXkgKSB7CgogICAgICBpZiggcm9vdCA9PSBOVUxMICkgcmV0dXJuIHJvb3Q7CgogICAgICBpZiggcm9vdC0+ZGF0YSA+IGtleSApCgogICAgICAgIHJvb3QtPmxlZnQgPSBkZWxldGUoIHJvb3QtPmxlZnQsIGtleSApOwoKICAgICAgZWxzZSBpZiggcm9vdC0+ZGF0YSA8IGtleSApCgogICAgICAgIHJvb3QtPnJpZ2h0ID0gZGVsZXRlKCByb290LT5yaWdodCwga2V5ICk7CgogICAgICBlbHNlIHsKCiAgICAgICAgaWYoIHJvb3QtPmxlZnQgPT0gTlVMTCAmJiByb290LT5yaWdodCA9PSBOVUxMICkgewoKICAgICAgICAgICBmcmVlKHJvb3QpOwoKICAgICAgICAgICByb290ID0gTlVMTDsKCiAgICAgICAgfSBlbHNlIGlmKCByb290LT5sZWZ0ID09IE5VTEwgKSB7CgogICAgICAgICAgICAgICBzdHJ1Y3QgTm9kZSAqdGVtcCA9IHJvb3Q7CiAgICAgICAgICAgICAgICAgICAgICByb290ID0gcm9vdC0+cmlnaHQ7CiAgICAgICAgICAgICAgICAgICAgICBmcmVlKHRlbXApOwoKICAgICAgICB9IGVsc2UgaWYoIHJvb3QtPiByaWdodCA9PSBOVUxMICkgewoKICAgICAgICAgICAgICAgc3RydWN0IE5vZGUgKnRlbXAgPSByb290OwogICAgICAgICAgICAgICAgICAgICByb290ID0gcm9vdC0+bGVmdDsKICAgICAgICAgICAgICAgICAgICAgZnJlZSh0ZW1wKTsKCiAgICAgICAgLy93ZSBoYXZlIGJvdGggY2hpbGRyZW46IGxlZnQgYW5kIHJpZ2h0CiAgICAgIH0gZWxzZSBpZihyb290LT5sZWZ0ICE9IE5VTEwgJiYgcm9vdC0+cmlnaHQgIT0gTlVMTCkgewoKICAgICAgICAgICAgICAgc3RydWN0IE5vZGUgKnAgPSBtb3N0bHlSaWdodE1pbihyb290LT5yaWdodCk7CgogICAgICAgICAgICAgICByb290LT5kYXRhID0gcC0+ZGF0YTsKCiAgICAgICAgICAgICAgIHJvb3QtPnJpZ2h0ID0gZGVsZXRlKHJvb3QtPnJpZ2h0LCBwLT5kYXRhKTsKICAgICAgICB9CgoKICAgICAgfQoKICAgICAgcmV0dXJuIHJvb3Q7Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyIGNvbnN0ICphcmd2W10pIHsKCiAgc3RydWN0IE5vZGUgKnJvb3QgPSBOVUxMOwogIHJvb3QgPSBpbnNlcnQocm9vdCwgOCk7CiAgICAgICAgIGluc2VydChyb290LCAzKTsKICAgICAgICAgaW5zZXJ0KHJvb3QsIDEwKTsKICAgICAgICAgaW5zZXJ0KHJvb3QsIDEpOwogICAgICAgICBpbnNlcnQocm9vdCwgNik7CiAgICAgICAgIGluc2VydChyb290LCA0KTsKICAgICAgICAgaW5zZXJ0KHJvb3QsIDcpOwogICAgICAgICBpbnNlcnQocm9vdCwgMTQpOwogICAgICAgICBpbnNlcnQocm9vdCwgMTMpOwogIGlub3JkZXIocm9vdCk7CgogIGludCBrZXkgPSAzOwogIHByaW50ZigiXG5EZWxldGVkIE5vZGUgPSAlZFxuIiwga2V5KTsKICBkZWxldGUocm9vdCwga2V5KTsKICBpbm9yZGVyKHJvb3QpOwoKICByZXR1cm4gMDsKfQo=