Delete binary sort tree

ALGORITHM

Binary sort tree, the delete operation will focus on three cases.

1 leaf nodes - can be deleted directly

2 left no child nodes - right subtree directly grafted on it (there is no right child nodes - left subtree directly grafted on it)

3 If the left and right subtrees are present, seek immediate predecessor delete nodes (ie, rightmost left child node tree inside)

Note that during programming, when the function pointer for the operation, and therefore in order to modify the pointer, two pointers to be used can pass parameters

E.g:

void delete(BinaryTree **b){

  ....

}

int main(){

  BinaryTree *b = (BinaryTree *)malloc(sizeof(BinaryTree));

  delete(&b);

}

Function Code:

bool deleteTree(BTree **b,int key){
    if(!*b)
        return false;
    else{
        if((*b)->data == key){
            return deleteNode(&(*b));
        }
        else if((*b)->data > key)
            return deleteTree(&(*b)->lchild,key);
        else
            return deleteTree(&(*b)->rchild,key);
    }
}
bool deleteNode(BTree **b){
    BTree *p,*s;
    if((*b)->lchild == NULL ){
        p = (*b);
        (*b) = (*b)->rchild;
        free(p);
    }else if((*b)->rchild == NULL){
        p = (*b);
        (*b) = (*b)->lchild;
        free(p);
    }else{
        p = (*b);
        s = (*b)->lchild;
        while(s->rchild != NULL){
            p = s;
            s = s->rchild;
        }
        (*b)->data = s->data;
        if(p != (*b))
            p->rchild = s->lchild;
        else
            p->lchild = s->lchild;
        free(s);
        return true;
    }
}

All Code:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 typedef struct bTree{
  4     int data;
  5     struct bTree *lchild,*rchild;
  6 }BTree;
  7 
  8 void initialTree(BTree *b);
  9 bool insertTree(BTree *b,int key);
 10 int searchTree(BTree *b,int key,BTree *f,BTree *&p);
 11 void InOrderTree(BTree *b);
 12 bool deleteTree(BTree **b,int key);
 13 bool deleteNode(BTree **b);
 14 
 15 int main(){
 16     BTree *b = (BTree *)malloc(sizeof(BTree));
 17     b->data = 5;
 18     b->lchild = b->rchild = NULL;
 19     initialTree(b);
 20     InOrderTree(b);
 21     deleteTree(&b,4);
 22     InOrderTree(b);
 23     getchar();
 24     return 0;
 25 }
 26 bool deleteTree(BTree **b,int key){
 27     if(!*b)
 28         return false;
 29     else{
 30         if((*b)->data == key){
 31             return deleteNode(&(*b));
 32         }
 33         else if((*b)->data > key)
 34             return deleteTree(&(*b)->lchild,key);
 35         else
 36             return deleteTree(&(*b)->rchild,key);
 37     }
 38 }
 39 bool deleteNode(BTree **b){
 40     BTree *p,*s;
 41     if((*b)->lchild == NULL ){
 42         p = (*b);
 43         (*b) = (*b)->rchild;
 44         free(p);
 45     }else if((*b)->rchild == NULL){
 46         p = (*b);
 47         (*b) = (*b)->lchild;
 48         free(p);
 49     }else{
 50         p = (*b);
 51         s = (*b)->lchild;
 52         while(s->rchild != NULL){
 53             p = s;
 54             s = s->rchild;
 55         }
 56         (*b)->data = s->data;
 57         if(p != (*b))
 58             p->rchild = s->lchild;
 59         else
 60             p->lchild = s->lchild;
 61         free(s);
 62         return true;
 63     }
 64 }
 65 void InOrderTree(BTree *b){
 66     if( !b )
 67         return;
 68     InOrderTree(b->lchild);
 69     printf("%d ",b->data);
 70     InOrderTree(b->rchild);
 71 }
 72 
 73 void initialTree(BTree *b){
 74     insertTree(b,5);
 75     insertTree(b,3);
 76     insertTree(b,4);
 77     insertTree(b,6);
 78     insertTree(b,2);
 79     insertTree(b,1);
 80     insertTree(b,8);
 81 }
 82 int searchTree(BTree *b,int key,BTree *f,BTree *&p){
 83     if(!b){
 84         p = f;
 85         printf("++%d\n",p->data);
 86         return 0;
 87     }
 88     else if( key == b->data){
 89         p = b;
 90         printf("--%d \n",p->data);
 91         printf("找到元素key:%d\n",key);
 92         return 1;
 93     }
 94     else if(key > b->data)
 95         return searchTree(b->rchild,key,b,p);
 96     else
 97         return searchTree(b->lchild,key,b,p);
 98 }
 99 bool insertTree(BTree *b,int key){
100     BTree *p,*s;
101     if(!searchTree(b,key,NULL,p)){
102         printf("%d 没有出现在树中,可以插入在%d之后\n",key,p->data);
103         s = (BTree *)malloc(sizeof(BTree));
104         s->data = key;
105         s->lchild = s->rchild = NULL;
106         if(!b){
107             b = s;
108         }
109         else if(key < p->data){
110             p->lchild = s;
111         }else{ 
112             p->rchild = s;
113         }
114         return true;
115     }else
116         return false;
117 }
View Code

Run the sample:

Reproduced in: https: //my.oschina.net/u/204616/blog/545279

Guess you like

Origin blog.csdn.net/weixin_34290096/article/details/91989389