#include <stdio.h>
#include <malloc.h>
//BST = Binary Search Tree ( insert, search, traversals: inorder, preorder, postorder, remove)
//arbore binar de cautare
//strtok token
typedef struct Node {
int data;
struct Node *left;
struct Node *right;
} Node;
Node *insert(Node *root, int val) {
if(root == NULL) {
//root = new Node;aloca spatiu in HEAP pentru Node
root = (Node*)malloc(sizeof(Node));
root->data = val;
root->left = NULL; //0, nullptr
root->right = NULL; //
} else {
if( root->data < val ) {
root->right = insert(root->right, val);
} else {
root->left = insert(root->left, val);
}
}
return root;
}
void inorder(Node *node) {
if(node) {
inorder(node->left);
printf("%d ", node->data);
inorder(node->right);
}
}
void preorder(Node *node) {
if(node) {
printf("%d ", node->data);
preorder(node->left);
preorder(node->right);
}
}
void postorder(Node *node) {
if(node) {
printf("%d ", node->data);
postorder(node->left);
postorder(node->right);
}
}
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;
}
}
// subarborele drept
Node *mostlyLeft(Node *root) {
while( root->left ) root = root->left;
return root;
}
//stergerea: se sterge nodul si se inlocuieste cu cel mai din stanga nod din subarborele drept
Node* remove(Node *root, int key) {
if(root == NULL) {
return root;
} else if(root->data > key ) {
root->left = remove(root->left, key);
} else if(root->data < key ) {
root->right = remove(root->right, key);
} else {
if(root->left == NULL && root->right == NULL) {
free( root );
return NULL;
} else if( root->left == NULL) {
Node *temp = root->right;
free(root);
return temp;
} else if( root->right == NULL) {
Node *temp = root->left;
free(root);
return temp;
} else if( root->left != NULL && root->right != NULL ) {
//cel mai din stanga din subarborele drept
Node *temp = mostlyLeft( root->right );
root->data = temp->data;
root->right = remove(root->right, temp->data);
}
}
return root;
}
int main(int argc, char const *argv[]) {
Node *root = NULL;
root = insert(root, 12);
insert(root, 5);
insert(root, 4);
insert(root, 18);
insert(root, 52);
insert(root, 22);
insert(root, 51);
insert(root, 53);
printf("\nInorder: \n");
inorder( root );
printf("\nPreorder: \n");
preorder( root );
printf("\nPostorder: \n");
postorder( root );
int key_search = 18;
int answer;
answer = search( root, key_search );
if( answer == 1 ) {
printf("\nThe key: %d Found in BST\n", key_search);
} else {
printf("\nThe key: %d Not Found in BST\n", key_search);
}
int key_remove = 52;
if(search(root, key_remove) == 1) {
printf("\n%s: %d\n", "Stergere Node", key_remove);
remove(root, key_remove);
inorder(root);
} else {
printf("\n%s: %d\n", "Nu am cum sa-l sterg pentru ca nu exista in BST", key_remove);
}
//free -> elibereaza spatiul de memorie din HEAP
//malloc - se aloca spatiu in HEAP
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCi8vQlNUID0gQmluYXJ5IFNlYXJjaCBUcmVlICggaW5zZXJ0LCBzZWFyY2gsIHRyYXZlcnNhbHM6IGlub3JkZXIsIHByZW9yZGVyLCBwb3N0b3JkZXIsIHJlbW92ZSkKLy9hcmJvcmUgYmluYXIgZGUgY2F1dGFyZQoKLy9zdHJ0b2sgdG9rZW4KCnR5cGVkZWYgc3RydWN0IE5vZGUgewoKICAgICAgIGludCBkYXRhOwogICAgICAgc3RydWN0IE5vZGUgKmxlZnQ7CiAgICAgICBzdHJ1Y3QgTm9kZSAqcmlnaHQ7Cgp9IE5vZGU7CgpOb2RlICppbnNlcnQoTm9kZSAqcm9vdCwgaW50IHZhbCkgewoKICAgICBpZihyb290ID09IE5VTEwpIHsKCiAgICAgICAgIC8vcm9vdCA9IG5ldyBOb2RlO2Fsb2NhIHNwYXRpdSBpbiBIRUFQIHBlbnRydSBOb2RlCiAgICAgICAgIHJvb3QgPSAoTm9kZSopbWFsbG9jKHNpemVvZihOb2RlKSk7CiAgICAgICAgIHJvb3QtPmRhdGEgPSB2YWw7CiAgICAgICAgIHJvb3QtPmxlZnQgPSBOVUxMOyAvLzAsIG51bGxwdHIKICAgICAgICAgcm9vdC0+cmlnaHQgPSBOVUxMOyAvLwoKICAgICB9IGVsc2UgewoKICAgICAgICBpZiggcm9vdC0+ZGF0YSA8IHZhbCApIHsKCiAgICAgICAgICAgIHJvb3QtPnJpZ2h0ID0gaW5zZXJ0KHJvb3QtPnJpZ2h0LCB2YWwpOwoKICAgICAgICB9IGVsc2UgewoKICAgICAgICAgICAgcm9vdC0+bGVmdCA9IGluc2VydChyb290LT5sZWZ0LCB2YWwpOwogICAgICAgIH0KCiAgICAgfQoKICAgICByZXR1cm4gcm9vdDsKfQoKdm9pZCBpbm9yZGVyKE5vZGUgKm5vZGUpIHsKCiAgICAgaWYobm9kZSkgewogICAgICAgaW5vcmRlcihub2RlLT5sZWZ0KTsKICAgICAgIHByaW50ZigiJWQgIiwgbm9kZS0+ZGF0YSk7CiAgICAgICBpbm9yZGVyKG5vZGUtPnJpZ2h0KTsKICAgICB9Cn0KCnZvaWQgcHJlb3JkZXIoTm9kZSAqbm9kZSkgewoKICBpZihub2RlKSB7CiAgICBwcmludGYoIiVkICIsIG5vZGUtPmRhdGEpOwogICAgcHJlb3JkZXIobm9kZS0+bGVmdCk7CiAgICBwcmVvcmRlcihub2RlLT5yaWdodCk7CiAgfQp9Cgp2b2lkIHBvc3RvcmRlcihOb2RlICpub2RlKSB7CgogIGlmKG5vZGUpIHsKICAgIHByaW50ZigiJWQgIiwgbm9kZS0+ZGF0YSk7CiAgICBwb3N0b3JkZXIobm9kZS0+bGVmdCk7CiAgICBwb3N0b3JkZXIobm9kZS0+cmlnaHQpOwogIH0KfQoKaW50IHNlYXJjaChOb2RlICpyb290LCBpbnQga2V5KSB7CgogICAgaWYocm9vdCA9PSBOVUxMKSB7CgogICAgICAgcmV0dXJuIDA7CgogICAgfSBlbHNlIGlmKCByb290LT5kYXRhID4ga2V5ICkgewoKICAgICAgIHJldHVybiBzZWFyY2gocm9vdC0+bGVmdCwga2V5KTsKCiAgICB9IGVsc2UgaWYocm9vdC0+ZGF0YSA8IGtleSApIHsKCiAgICAgICByZXR1cm4gc2VhcmNoKHJvb3QtPnJpZ2h0LCBrZXkpOwoKICAgIH0gZWxzZSB7CgogICAgICByZXR1cm4gMTsKICAgIH0KCn0KCi8vICAgICAgICAgICAgICAgICAgc3ViYXJib3JlbGUgZHJlcHQKTm9kZSAqbW9zdGx5TGVmdChOb2RlICpyb290KSB7CgogICAgICB3aGlsZSggcm9vdC0+bGVmdCApIHJvb3QgPSByb290LT5sZWZ0OwoKICAgICAgcmV0dXJuIHJvb3Q7Cn0KCgovL3N0ZXJnZXJlYTogc2Ugc3RlcmdlIG5vZHVsIHNpIHNlIGlubG9jdWllc3RlIGN1IGNlbCBtYWkgZGluIHN0YW5nYSBub2QgZGluIHN1YmFyYm9yZWxlIGRyZXB0Ck5vZGUqIHJlbW92ZShOb2RlICpyb290LCBpbnQga2V5KSB7CgogICAgICBpZihyb290ID09IE5VTEwpIHsKCiAgICAgICAgIHJldHVybiByb290OwoKICAgICAgfSBlbHNlIGlmKHJvb3QtPmRhdGEgID4ga2V5ICkgewoKICAgICAgICAgIHJvb3QtPmxlZnQgPSByZW1vdmUocm9vdC0+bGVmdCwga2V5KTsKCiAgICAgIH0gZWxzZSBpZihyb290LT5kYXRhIDwga2V5ICkgewoKICAgICAgICAgIHJvb3QtPnJpZ2h0ID0gcmVtb3ZlKHJvb3QtPnJpZ2h0LCBrZXkpOwoKICAgICAgfSBlbHNlIHsKCiAgICAgICAgICBpZihyb290LT5sZWZ0ID09IE5VTEwgJiYgcm9vdC0+cmlnaHQgPT0gTlVMTCkgewoKICAgICAgICAgICAgICBmcmVlKCByb290ICk7CiAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgICAgICAgfSBlbHNlIGlmKCByb290LT5sZWZ0ID09IE5VTEwpIHsKCiAgICAgICAgICAgIE5vZGUgKnRlbXAgPSByb290LT5yaWdodDsKICAgICAgICAgICAgZnJlZShyb290KTsKICAgICAgICAgICAgcmV0dXJuIHRlbXA7CgogICAgICAgICAgfSBlbHNlIGlmKCByb290LT5yaWdodCA9PSBOVUxMKSAgewoKICAgICAgICAgICAgTm9kZSAqdGVtcCA9IHJvb3QtPmxlZnQ7CiAgICAgICAgICAgIGZyZWUocm9vdCk7CiAgICAgICAgICAgIHJldHVybiB0ZW1wOwoKICAgICAgICAgIH0gZWxzZSBpZiggcm9vdC0+bGVmdCAhPSBOVUxMICYmIHJvb3QtPnJpZ2h0ICE9IE5VTEwgKSB7CgogICAgICAgICAgICAvL2NlbCBtYWkgZGluIHN0YW5nYSBkaW4gc3ViYXJib3JlbGUgZHJlcHQKICAgICAgICAgICAgIE5vZGUgKnRlbXAgPSBtb3N0bHlMZWZ0KCByb290LT5yaWdodCApOwoKICAgICAgICAgICAgIHJvb3QtPmRhdGEgID0gdGVtcC0+ZGF0YTsKCgogICAgICAgICAgICAgcm9vdC0+cmlnaHQgPSByZW1vdmUocm9vdC0+cmlnaHQsIHRlbXAtPmRhdGEpOwogICAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcm9vdDsKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgY29uc3QgKmFyZ3ZbXSkgewoKICBOb2RlICpyb290ID0gTlVMTDsKCiAgcm9vdCA9IGluc2VydChyb290LCAxMik7CgogIGluc2VydChyb290LCA1KTsKICBpbnNlcnQocm9vdCwgNCk7CiAgaW5zZXJ0KHJvb3QsIDE4KTsKICBpbnNlcnQocm9vdCwgNTIpOwogIGluc2VydChyb290LCAyMik7CiAgaW5zZXJ0KHJvb3QsIDUxKTsKICBpbnNlcnQocm9vdCwgNTMpOwoKICBwcmludGYoIlxuSW5vcmRlcjogXG4iKTsKICBpbm9yZGVyKCByb290ICk7CgogIHByaW50ZigiXG5QcmVvcmRlcjogXG4iKTsKICBwcmVvcmRlciggcm9vdCApOwoKICBwcmludGYoIlxuUG9zdG9yZGVyOiBcbiIpOwogIHBvc3RvcmRlciggcm9vdCApOwoKICBpbnQga2V5X3NlYXJjaCA9IDE4OwoKICBpbnQgYW5zd2VyOwoKICBhbnN3ZXIgPSBzZWFyY2goIHJvb3QsIGtleV9zZWFyY2ggKTsKCiAgaWYoIGFuc3dlciA9PSAxICkgewogICAgcHJpbnRmKCJcblRoZSBrZXk6ICVkIEZvdW5kIGluIEJTVFxuIiwga2V5X3NlYXJjaCk7CiAgfSBlbHNlIHsKICAgIHByaW50ZigiXG5UaGUga2V5OiAlZCBOb3QgRm91bmQgaW4gQlNUXG4iLCBrZXlfc2VhcmNoKTsKICB9CgogIGludCBrZXlfcmVtb3ZlID0gNTI7CgogIGlmKHNlYXJjaChyb290LCBrZXlfcmVtb3ZlKSA9PSAxKSB7CiAgICAgcHJpbnRmKCJcbiVzOiAlZFxuIiwgIlN0ZXJnZXJlIE5vZGUiLCBrZXlfcmVtb3ZlKTsKICAgICByZW1vdmUocm9vdCwga2V5X3JlbW92ZSk7CiAgICAgaW5vcmRlcihyb290KTsKICB9IGVsc2UgewogICAgIHByaW50ZigiXG4lczogJWRcbiIsICJOdSBhbSBjdW0gc2EtbCBzdGVyZyBwZW50cnUgY2EgbnUgZXhpc3RhIGluIEJTVCIsIGtleV9yZW1vdmUpOwogIH0KCiAgLy9mcmVlIC0+IGVsaWJlcmVhemEgc3BhdGl1bCBkZSBtZW1vcmllIGRpbiBIRUFQCiAgLy9tYWxsb2MgLSBzZSBhbG9jYSBzcGF0aXUgaW4gSEVBUAogIHJldHVybiAwOwp9Cg==