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;
}
Beispiel #2
0
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;
}