struct node *delete_node(struct node *root, int data) { if (root != NULL) { if (root->data < data) root->left = delete_node(root, data); else if (root->data>data) root->right = delete_node(root, data); else { if (root->left == NULL&&root->right == NULL) root = NULL; else if (root->left == NULL) return root->right; else if (root->right == NULL) return root->left; else { struct node *inorder_succ = inorder_successor(root->right); root->data = inorder_succ->data; root->right = delete_node(root->right, inorder_succ->data); } } } return root; }
treenode_t* tree_remove(treenode_t **treenode, char *name){ if (*treenode == NULL){ return *treenode; } if(strcmp(name, itemname((*treenode)->item)) < 0){ (*treenode)->left = tree_remove(&(*treenode)->left, name); } if (strcmp(name, itemname((*treenode)->item)) > 0){ (*treenode)->right = tree_remove(&(*treenode)->right, name); } else if ((*treenode)->left == NULL && (*treenode)->right == NULL){ free(treenode); } /// Node has 1 child (right) else if ((*treenode)->left == NULL) { treenode_t *temp = (*treenode)->right; free(*treenode); return temp; } /// Node has 1 child (left) else if ((*treenode)->right == NULL){ treenode_t*temp = (*treenode) ->left; free(*treenode); return temp; } // Find inorder successor treenode_t *temp = inorder_successor((*treenode)->right, name); //store inorder successor in node (*treenode)->item = temp->item; //delete the inorder successor (*treenode)->right = tree_remove(&(*treenode)->right, itemname(temp->item)); return *treenode; }
int main(){ struct Node *root = NULL; root = insert(root,10); insert(root,7); insert(root,16); insert(root,9); insert(root,8); insert(root,5); insert(root,22); printf("\nInorder : "); inorder(root); int key = 10; struct Node *keyNode = search(root,key); printf("\nSearch for %d : %d and parent: %d",key, keyNode == NULL ? -1 : keyNode->data); //printf("\nDeleting key %d : %d",key,delete_key(root,key)->data); printf("\nInorder : "); inorder(root); printf("\nIs tree BST : %d",isBst(root)); int key1 = 8; int key2 = 22; struct Node *lca = lowestCommonAncestor(root,key1,key2); printf("\nLowest Common Ancestor for %d and %d is : %d",key1,key2,lca == NULL ? -1 : lca->data); int a[] = {4, 2, 5, 1, 3}; int sa = sizeof(a)/sizeof(a[0]); printf("\nArray is printed in ascending order : "); printSorted(a,0,sa); int item = 5; struct Node* succ = inorder_successor(root,item); printf("\nInorder Successor for %d is : %d",item,succ == NULL ? -1 : succ->data); int k = 5; printf("\n%d smallest key in BST is %d",k,kth_smallest_bst(root,k)); { int key1 = 9,key2 = 22; printf("\nPrinting keys in range of %d and %d : ",key1,key2); printKeysInRange(root,key1,key2); } { int a[] = {1, 2, 3, 4, 5, 6, 7}; int sa = sizeof(a)/sizeof(a[0]); struct Node *root = sortedArrayToBalancedBst(a,0,sa-1); printf("\nInorder : "); inorder(root); } { Node* root = NULL; root = insert(root, 6); root = insert(root, -13); root = insert(root, 14); root = insert(root, -8); root = insert(root, 15); root = insert(root, 13); root = insert(root, 7); printf("\nInorder traversal of the given tree is: "); inorder(root); root = removeKeysOutsideRange(root, -10, 13); printf("\nInorder traversal of the modified tree is: "); inorder(root); } return 0; }