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 }
Run the sample:
Reproduced in: https: //my.oschina.net/u/204616/blog/545279