#include <stdio.h>
#include <malloc.h>
typedef struct Node {
struct Node * left;
struct Node * right;
int data;
} Node;
Node *insert(Node * root, int key) {
if(root == NULL) {
root
= (Node
*)malloc(sizeof(Node
)); root->left= NULL;
root->right = NULL;
root->data = key;
} else {
if(root->data < key) {
root->right = insert(root->right, key);
} else if(root->data > key) {
root->left = insert(root->left, key);
}
}
return root;
}
Node *mostlyLeft(Node *root) {
while(root->left) {
root = root->left;
}
return root;
}
Node *delete(Node *root, int key) {
if(root == NULL) {
return root;
} else 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) {
return NULL;
} else if(root->left == NULL) {
Node *temp = root->right;
return temp;
} else if(root->right == NULL) {
Node *temp = root->left;
return temp;
} else if (root->left != NULL && root->right != NULL) {
Node *temp = mostlyLeft(root->right);
root->data = temp->data;
root->right = delete(root->right, temp->data);
}
}
return root;
}
int search(Node *root, int key) {
if(root == NULL) {
return 0;
} else if(root->data > key) {
return search(root->left, key);
} else if(root->data < key) {
return search(root->right, key);
} else {
return 1;
}
}
void inorder(Node*node) {
if(node) {
inorder(node->left);
inorder(node->right);
}
}
void preorder(Node*node) {
if(node) {
inorder(node->left);
inorder(node->right);
}
}
void postorder(Node*node) {
if(node) {
inorder(node->left);
inorder(node->right);
}
}
int main(int argc, char const *argv[]) {
Node *root = NULL;
root = insert(root, 10);
insert(root, 5);
insert(root, 4);
insert(root, 18);
insert(root, 1);
insert(root, 5);
insert(root, 19);
insert(root, 23);
insert(root, 22);
insert(root, 14);
printf("%s", "Inorder Traversal: "); inorder(root);
printf("\n%s", "Preorder Traversal: "); preorder(root);
printf("\n%s", "Postorder Traversal: "); postorder(root);
int keysearch = 111, r;
r = search(root, keysearch);
if(r == 1) {
printf("\nThe key %d Found in BST.", keysearch
); } else {
printf("\nThe key %d Not Found in BST.", keysearch
); }
int keydelete = 10;
printf("\nDelete %d and inorder\n", keydelete
); delete(root, keydelete);
inorder(root);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCnR5cGVkZWYgc3RydWN0IE5vZGUgewogICAgICAgc3RydWN0IE5vZGUgKiBsZWZ0OwogICAgICAgc3RydWN0IE5vZGUgKiByaWdodDsKICAgICAgIGludCBkYXRhOwp9IE5vZGU7CgpOb2RlICppbnNlcnQoTm9kZSAqIHJvb3QsIGludCBrZXkpIHsKCiAgICAgIGlmKHJvb3QgPT0gTlVMTCkgewogICAgICAgIHJvb3QgPSAoTm9kZSopbWFsbG9jKHNpemVvZihOb2RlKSk7CiAgICAgICAgcm9vdC0+bGVmdD0gTlVMTDsKICAgICAgICByb290LT5yaWdodCA9IE5VTEw7CiAgICAgICAgcm9vdC0+ZGF0YSA9IGtleTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZihyb290LT5kYXRhIDwga2V5KSB7CiAgICAgICAgICByb290LT5yaWdodCA9IGluc2VydChyb290LT5yaWdodCwga2V5KTsKICAgICAgICB9IGVsc2UgaWYocm9vdC0+ZGF0YSA+IGtleSkgewogICAgICAgICAgcm9vdC0+bGVmdCA9IGluc2VydChyb290LT5sZWZ0LCBrZXkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHJvb3Q7Cn0KCk5vZGUgKm1vc3RseUxlZnQoTm9kZSAqcm9vdCkgewogICAgICB3aGlsZShyb290LT5sZWZ0KSB7CiAgICAgICAgcm9vdCA9IHJvb3QtPmxlZnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHJvb3Q7Cn0KCk5vZGUgKmRlbGV0ZShOb2RlICpyb290LCBpbnQga2V5KSB7CgogICAgIGlmKHJvb3QgPT0gTlVMTCkgewoKICAgICAgIHJldHVybiByb290OwoKICAgICB9IGVsc2UgaWYocm9vdC0+ZGF0YSA+IGtleSkgewoKICAgICAgIHJvb3QtPmxlZnQgPSBkZWxldGUocm9vdC0+bGVmdCwga2V5KTsKCiAgICAgfSBlbHNlIGlmKHJvb3QtPmRhdGEgPCBrZXkpIHsKCiAgICAgICByb290LT5yaWdodCA9IGRlbGV0ZShyb290LT5yaWdodCwga2V5KTsKCiAgICAgfSBlbHNlIHsKCiAgICAgICBpZihyb290LT5sZWZ0ID09IE5VTEwgJiYgcm9vdC0+cmlnaHQgPT0gTlVMTCkgewoKICAgICAgICAgIGZyZWUocm9vdCk7CiAgICAgICAgICByZXR1cm4gTlVMTDsKCiAgICAgICB9IGVsc2UgaWYocm9vdC0+bGVmdCA9PSBOVUxMKSB7CgogICAgICAgICAgTm9kZSAqdGVtcCA9IHJvb3QtPnJpZ2h0OwogICAgICAgICAgZnJlZShyb290KTsKICAgICAgICAgIHJldHVybiB0ZW1wOwoKICAgICAgIH0gZWxzZSBpZihyb290LT5yaWdodCA9PSBOVUxMKSB7CiAgICAgICAgIAogICAgICAgICAgTm9kZSAqdGVtcCA9IHJvb3QtPmxlZnQ7CiAgICAgICAgICBmcmVlKHJvb3QpOwogICAgICAgICAgcmV0dXJuIHRlbXA7CgogICAgICAgfSBlbHNlIGlmIChyb290LT5sZWZ0ICE9IE5VTEwgJiYgcm9vdC0+cmlnaHQgIT0gTlVMTCkgIHsKCiAgICAgICAgIE5vZGUgKnRlbXAgPSBtb3N0bHlMZWZ0KHJvb3QtPnJpZ2h0KTsKICAgICAgICAgICAgICAgcm9vdC0+ZGF0YSA9IHRlbXAtPmRhdGE7CiAgICAgICAgICAgICAgIHJvb3QtPnJpZ2h0ID0gZGVsZXRlKHJvb3QtPnJpZ2h0LCB0ZW1wLT5kYXRhKTsKICAgICAgIH0KCgogICAgIH0KCiAgICAgcmV0dXJuIHJvb3Q7Cn0KCmludCBzZWFyY2goTm9kZSAqcm9vdCwgaW50IGtleSkgewogICAgaWYocm9vdCA9PSBOVUxMKSB7CiAgICAgICByZXR1cm4gMDsKICAgIH0gZWxzZSBpZihyb290LT5kYXRhID4ga2V5KSB7CiAgICAgIHJldHVybiBzZWFyY2gocm9vdC0+bGVmdCwga2V5KTsKICAgIH0gZWxzZSBpZihyb290LT5kYXRhIDwga2V5KSB7CiAgICAgIHJldHVybiBzZWFyY2gocm9vdC0+cmlnaHQsIGtleSk7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gMTsKICAgIH0KfQoKdm9pZCBpbm9yZGVyKE5vZGUqbm9kZSkgewogICAgIGlmKG5vZGUpIHsKICAgICAgIGlub3JkZXIobm9kZS0+bGVmdCk7CiAgICAgICBwcmludGYoIiVkICIsIG5vZGUtPmRhdGEpOwogICAgICAgaW5vcmRlcihub2RlLT5yaWdodCk7CiAgICAgfQp9Cgp2b2lkIHByZW9yZGVyKE5vZGUqbm9kZSkgewogICAgIGlmKG5vZGUpIHsKICAgICAgIHByaW50ZigiJWQgIiwgbm9kZS0+ZGF0YSk7CiAgICAgICBpbm9yZGVyKG5vZGUtPmxlZnQpOwogICAgICAgaW5vcmRlcihub2RlLT5yaWdodCk7CiAgICAgfQp9Cgp2b2lkIHBvc3RvcmRlcihOb2RlKm5vZGUpIHsKICAgICBpZihub2RlKSB7CiAgICAgICBpbm9yZGVyKG5vZGUtPmxlZnQpOwogICAgICAgaW5vcmRlcihub2RlLT5yaWdodCk7CiAgICAgICBwcmludGYoIiVkICIsIG5vZGUtPmRhdGEpOwogICAgIH0KfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkgewoKICBOb2RlICpyb290ID0gTlVMTDsKCiAgcm9vdCA9IGluc2VydChyb290LCAxMCk7CiAgaW5zZXJ0KHJvb3QsIDUpOwogIGluc2VydChyb290LCA0KTsKICBpbnNlcnQocm9vdCwgMTgpOwogIGluc2VydChyb290LCAxKTsKICBpbnNlcnQocm9vdCwgNSk7CiAgaW5zZXJ0KHJvb3QsIDE5KTsKICBpbnNlcnQocm9vdCwgMjMpOwogIGluc2VydChyb290LCAyMik7CiAgaW5zZXJ0KHJvb3QsIDE0KTsKICBwcmludGYoIiVzIiwgIklub3JkZXIgVHJhdmVyc2FsOiAiKTsKICBpbm9yZGVyKHJvb3QpOwogIHByaW50ZigiXG4lcyIsICJQcmVvcmRlciBUcmF2ZXJzYWw6ICIpOwogIHByZW9yZGVyKHJvb3QpOwogIHByaW50ZigiXG4lcyIsICJQb3N0b3JkZXIgVHJhdmVyc2FsOiAiKTsKICBwb3N0b3JkZXIocm9vdCk7CiAgaW50IGtleXNlYXJjaCA9IDExMSwgcjsKICByID0gc2VhcmNoKHJvb3QsIGtleXNlYXJjaCk7CiAgaWYociA9PSAxKSB7CiAgICBwcmludGYoIlxuVGhlIGtleSAlZCBGb3VuZCBpbiBCU1QuIiwga2V5c2VhcmNoKTsKICB9IGVsc2UgewogICAgcHJpbnRmKCJcblRoZSBrZXkgJWQgTm90IEZvdW5kIGluIEJTVC4iLCBrZXlzZWFyY2gpOwogIH0KICBpbnQga2V5ZGVsZXRlID0gMTA7CiAgcHJpbnRmKCJcbkRlbGV0ZSAlZCBhbmQgaW5vcmRlclxuIiwga2V5ZGVsZXRlKTsKICBkZWxldGUocm9vdCwga2V5ZGVsZXRlKTsKICBpbm9yZGVyKHJvb3QpOwogIHJldHVybiAwOwp9Cg==