/* BST structure before deletion: 30 / \ 20 40 */ // Delete node with value 20 // Print inorder traversal after deletion #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = node->right = NULL; return node; } struct Node* insert(struct Node* root, int data) { if (root == NULL) return newNode(data); if (data < root->data) root->left = insert(root->left, data); else root->right = insert(root->right, data); return root; } struct Node* minValueNode(struct Node* node) { struct Node* current = node; while (current && current->left != NULL) current = current->left; return current; } struct Node* deleteNode(struct Node* root, int key) { if (root == NULL) return root; if (key < root->data) root->left = deleteNode(root->left, key); else if (key > root->data) root->right = deleteNode(root->right, key); else { if (root->left == NULL) { struct Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct Node* temp = root->left; free(root); return temp; } struct Node* temp = minValueNode(root->right); root->data = temp->data; root->right = deleteNode(root->right, temp->data); } return root; } void inorder(struct Node* root) { if (root != NULL) { inorder(root->left); printf("%d -> ", root->data); inorder(root->right); } } int main() { struct Node* root = NULL; root = insert(root, 30); root = insert(root, 20); root = insert(root, 40); root = deleteNode(root, 20); inorder(root); printf("null\n"); return 0; }
Deleting node 20, which is a leaf, removes it directly. The inorder traversal then visits 30, and 40 in order.
/* BST structure before deletion: 30 / \ 20 40 25 */ // Delete node with value 20 // Print inorder traversal after deletion #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = node->right = NULL; return node; } struct Node* insert(struct Node* root, int data) { if (root == NULL) return newNode(data); if (data < root->data) root->left = insert(root->left, data); else root->right = insert(root->right, data); return root; } struct Node* minValueNode(struct Node* node) { struct Node* current = node; while (current && current->left != NULL) current = current->left; return current; } struct Node* deleteNode(struct Node* root, int key) { if (root == NULL) return root; if (key < root->data) root->left = deleteNode(root->left, key); else if (key > root->data) root->right = deleteNode(root->right, key); else { if (root->left == NULL) { struct Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct Node* temp = root->left; free(root); return temp; } struct Node* temp = minValueNode(root->right); root->data = temp->data; root->right = deleteNode(root->right, temp->data); } return root; } void inorder(struct Node* root) { if (root != NULL) { inorder(root->left); printf("%d -> ", root->data); inorder(root->right); } } int main() { struct Node* root = NULL; root = insert(root, 30); root = insert(root, 20); root = insert(root, 40); root = insert(root, 25); root = deleteNode(root, 20); inorder(root); printf("null\n"); return 0; }
Node 20 has one child 25. After deletion, 25 takes 20's place. Inorder traversal visits 25, 30, 40.
/* BST structure before deletion: 30 / \ 20 40 / \ \ 10 25 50 */ // Delete node with value 30 // Print inorder traversal after deletion #include <stdio.h> #include <stdlib.h> struct Node { int data; struct Node* left; struct Node* right; }; struct Node* newNode(int data) { struct Node* node = (struct Node*)malloc(sizeof(struct Node)); node->data = data; node->left = node->right = NULL; return node; } struct Node* insert(struct Node* root, int data) { if (root == NULL) return newNode(data); if (data < root->data) root->left = insert(root->left, data); else root->right = insert(root->right, data); return root; } struct Node* minValueNode(struct Node* node) { struct Node* current = node; while (current && current->left != NULL) current = current->left; return current; } struct Node* deleteNode(struct Node* root, int key) { if (root == NULL) return root; if (key < root->data) root->left = deleteNode(root->left, key); else if (key > root->data) root->right = deleteNode(root->right, key); else { if (root->left == NULL) { struct Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct Node* temp = root->left; free(root); return temp; } struct Node* temp = minValueNode(root->right); root->data = temp->data; root->right = deleteNode(root->right, temp->data); } return root; } void inorder(struct Node* root) { if (root != NULL) { inorder(root->left); printf("%d -> ", root->data); inorder(root->right); } } int main() { struct Node* root = NULL; root = insert(root, 30); root = insert(root, 20); root = insert(root, 40); root = insert(root, 10); root = insert(root, 25); root = insert(root, 50); root = deleteNode(root, 30); inorder(root); printf("null\n"); return 0; }
Node 30 has two children. It is replaced by its inorder successor 40. Then 40 is deleted from its original position. The inorder traversal visits 10, 20, 25, 40, 50.
struct Node* deleteNode(struct Node* root, int key) { if (root == NULL) return root; if (key < root->data) root->left = deleteNode(root->left, key); else if (key > root->data) root->right = deleteNode(root->right, key); else { if (root->left == NULL) { struct Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { struct Node* temp = root->left; free(root); return temp; } struct Node* temp = minValueNode(root->left); // Error here root->data = temp->data; root->left = deleteNode(root->left, temp->data); } return root; }
The standard BST delete replaces the node with its inorder successor (minimum node in right subtree). Using minValueNode(root->left) is incorrect and replaces with wrong node.
Initial nodes: 7. Deleting 20 (leaf), 30 (node with one child), and 50 (root with two children). After deletions, 4 nodes remain.
