Skip to content

Instantly share code, notes, and snippets.

@dhananjay1438
Created January 3, 2021 10:32
Show Gist options
  • Save dhananjay1438/b86ce882b2e89341513867236c81b570 to your computer and use it in GitHub Desktop.
Save dhananjay1438/b86ce882b2e89341513867236c81b570 to your computer and use it in GitHub Desktop.
Binary search tree in c (but has problem in delete function)
#include <stdio.h>
#include <stdlib.h>
struct node {
int data;
struct node* left;
struct node* right;
};
struct node* root = NULL;
struct node* insert(struct node* temp, int data) {
struct node* new_node = (struct node*) malloc(sizeof(struct node));
new_node -> right = NULL;
new_node -> left = NULL;
new_node -> data = data;
if (temp == NULL) {
temp = new_node;
//printf("First element\n");
return temp;
}
else {
while (temp != NULL) {
if (temp -> data > new_node -> data) {
if (temp -> left == NULL) {
temp -> left = new_node;
// printf("Adding to left side of the root\n");
break;
}
else
temp = temp -> left;
}
else {
if (temp -> right == NULL) {
// printf("Adding to the right side of the root\n");
temp -> right = new_node;
break;
}
else
temp = temp -> right;
}
}
}
}
int search(struct node* tree, int key) {
while (tree != NULL) {
if (tree -> data == key) {
printf("Element found\n");
return -1;
}
if (tree -> data > key) {
tree = tree -> left;
}
else {
tree = tree -> right;
}
}
printf("Element not found\n");
}
void delete(struct node* tree, int key) {
struct node* prev = NULL;
while (tree != NULL) {
if (tree -> data == key) {
if (tree -> right == NULL && tree -> left == NULL) {
// This doesn't work, why?
if (prev -> left -> data == tree -> data) {
printf("YES\n");
printf("prev -> left -> data = %d\n", prev -> left -> data);
printf("tree -> data = %d\n", tree -> data);
printf("{Before}prev -> left = %d\n", prev -> left);
prev -> left == NULL;
free(tree);
printf("{After} prev -> left = %d\n", prev -> left);
printf("{After} prev -> left -> data = %d\n", prev -> left -> data);
prev -> right == NULL;
break;
}
// This works, Why?
//free(tree);
//printf("Prev -> data = %d\n", prev -> data);
//printf("%d\n", prev -> left);
//prev -> left = NULL;
//printf("%d\n", prev -> left);
//break;
}
}
if(tree -> data > key) {
prev = tree;
tree = tree -> left;
}
else {
prev = tree;
tree = tree -> right;
}
}
}
int main(void) {
root = insert(root, 10);
insert(root, 20);
insert(root, 30);
insert(root, 25);
insert(root, 5);
insert(root, 1);
//search(root, 5);
//search(root, 20);
//search(root, 30);
//search(root, 25);
search(root, 1);
delete(root, 1);
search(root, 1);
//search(root, 5);
// delete(root, 5);
//search(root, 5);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment