一个链式二叉搜索树接口(为下一篇红黑树的内容做铺垫)

最近一直在看红黑树的相关文章,但是还是有一些地方没有研究的特别透彻,等我研究明白了应该会写一篇关于红黑树的博客,由于红黑树是一种自平衡的二叉搜索树的结构,所以先翻出很久以前自己写的一个链式的二叉搜索树的接口,为下一篇红黑树的文章做铺垫。

代码如下:

代码我写的注释比较少,而且是之前用windows下gvim编写的所以注释用了英文,看着可能比较麻烦,不过还是欢迎纠错和共同分享经验...

  1 /*
  2  *2 binary search tree
  3  *data struct : list
  4  *
  5  */
  6 
  7 #include <stdio.h>
  8 #include <stdlib.h>
  9 
 10 #define VALUE_TYPE int
 11 
 12 typedef struct search_tree_node
 13 {
 14     VALUE_TYPE value;
 15     struct search_tree_node *l_child;
 16     struct search_tree_node *r_child;
 17 
 18 }search_tree_node,*search_tree;
 19 
 20 /*name: search_tree_init
 21  * *return:
 22  * search_tree 
 23  */
 24 
 25 search_tree search_tree_init()
 26 {
 27     return NULL;
 28 }
 29 
 30 /*
 31  * *name: search_tree_node_create
 32  * *return:
 33  * NULL failed else success
 34  */
 35 
 36 search_tree_node *search_tree_node_create(VALUE_TYPE value)
 37 {
 38     search_tree_node *node = (search_tree_node *)malloc(sizeof(search_tree_node));
 39 
 40     if(node == NULL)
 41     {
 42         return NULL;
 43     }
 44 
 45     node->l_child = NULL;
 46     node->r_child = NULL;
 47     node->value = value;
 48     
 49     return node;
 50 }
 51 
 52 /*
 53  * * name: search_tree_insert
 54  * * return:
 55  * 1 success -1 failed
 56  */
 57 
 58 int search_tree_insert(search_tree *root,VALUE_TYPE value)
 59 {
 60     if(root == NULL)
 61     {
 62         return -1;
 63     }
 64 
 65     search_tree_node **link = root; //to save the child node
 66     search_tree_node *current = NULL;
 67 
 68     while((current = *link) != NULL)
 69     {
 70         if(value == current->value)
 71         {
 72             return -1; //the value is already exist int the tree;
 73         }
 74         else
 75         {
 76             if(value < current->value)
 77             {
 78                 link = &(current->l_child);
 79             }
 80             else
 81             {
 82                 link = &(current->r_child);
 83             }
 84         }
 85     }
 86     
 87     *link = search_tree_node_create(value);
 88     
 89     return 1;
 90 }
 91 
 92 /*
 93  * *name: search_tree_find
 94  * *return:
 95  * 1 find -1 not find
 96  */
 97 
 98 int search_tree_find(search_tree root,VALUE_TYPE value)
 99 {
100     if(root == NULL)
101     {
102         return -1;
103     }
104 
105     search_tree_node *current = root;
106     
107     while(current != NULL)
108     {
109         if(value == current->value)
110         {
111             return 1;
112         }
113         else
114         {
115             if(value < current->value)
116             {
117                 current = current->l_child;
118             }
119             else
120             {
121                 current = current->r_child;
122             }
123         }
124     }
125 
126     return -1;
127 }
128 
129 /*
130  * *name: search_tree_delete
131  * *return:
132  * 1 delete ok -1 delete failed
133  */
134 
135 int search_tree_delete(search_tree root,VALUE_TYPE value)
136 {
137     if(root == NULL)
138     {
139         return -1;
140     }
141 
142     search_tree_node **link = &root;
143     search_tree_node *current = *link;
144         int flag = 0;    
145 
146     while((current = *link) != NULL)
147     {
148         if(value == current->value)
149         {
150             flag = 1;
151             break;
152         }
153         else
154         {
155             if(value < current->value)
156             {
157                 link = &(current->l_child);
158             }
159             else
160             {
161                 link = &(current->r_child);
162             }
163         }
164     }
165 
166     if(flag == 0)
167     {
168         return -1; //the node is not exist 
169     }
170     
171     if((*link)->l_child == NULL && (*link)->r_child == NULL)
172     {//the node is leaf node
173         free(*link);
174         *link = NULL;    
175 
176         return 1;    
177     }
178     
179     if((*link)->l_child != NULL && (*link)->r_child != NULL)
180     {//the node has two child
181         search_tree_node **link_sub = &((*link)->l_child);
182         //search_tree_node *current_sub = *link_sub;
183         
184         search_tree_node *parent = NULL;
185         while( ( (*link_sub)->r_child ) != NULL )
186         {//find the left sub tree biggest node
187             //link_sub = &(current_sub->r_child); //logic error, calculate a r_child node redundant
188             parent = *link_sub;
189             link_sub = &((*link_sub)->r_child);
190         }
191         
192         (*link)->value = (*link_sub)->value; //change current sub tree root node value to left sub tree biggest node value
193         
194         if(parent != root && *link_sub != root)
195         {
196             parent->r_child = link_sub->l_child; //change node
197         }
198         
199         free(*link_sub);
200         *link_sub = NULL;
201 
202         return 1;        
203     }    
204 
205     //the node just have one child
206     search_tree_node *current_child;
207     
208     if((*link)->l_child != NULL)
209     {//just have left child
210         current_child = (*link)->l_child;
211     }
212     else
213     {//just have right child 
214         current_child = (*link)->r_child;
215     }    
216 
217     free(*link);
218     *link = current_child;
219     
220     return 1;
221 
222 }
223 
224 
225 /*
226  * *name:pre_order_tree
227  */
228 
229 void pre_order_tree(search_tree root,void (*search_tree_callback)(VALUE_TYPE value))
230 {
231     if(root != NULL)
232     {
233         search_tree_callback(root->value);
234         pre_order_tree(root->l_child,search_tree_callback);
235         pre_order_tree(root->r_child,search_tree_callback);
236     }
237 }
238 
239 /*
240  * *name:post_order_tree
241  */
242 
243 void post_order_tree(search_tree root,void (*search_tree_callback)(search_tree_node *current))
244 {
245     if(root != NULL)
246     {
247         post_order_tree(root->l_child,search_tree_callback);
248         post_order_tree(root->r_child,search_tree_callback);
249         search_tree_callback(root);
250     }
251 }
252 
253 /*
254  *name:print_node
255  */
256 
257 static void tree_node_print(VALUE_TYPE value)
258 {
259     printf("%d ",value);
260 }
261 
262 
263 /*
264  *name:free_node
265  */
266 
267 static void tree_node_free(search_tree_node *current)
268 {
269     free(current);
270 }
271 
272 /*
273  * *name:search_tree_destroy
274  */
275 
276 void search_tree_destroy(search_tree *root)
277 {//use post traverse to free tree node
278     if(root == NULL)
279     {
280         return;
281     }
282 
283     search_tree_node *current = *root;
284     
285     post_order_tree(current,tree_node_free);
286 
287     *root = NULL;
288 }
289 
290 int main()
291 {
292     search_tree tree = search_tree_init();
293     
294     int i = 0;
295     int value;
296     
297     for(i = 0; i < 10; i++)
298     {
299         scanf("%d",&value);
300         
301         search_tree_insert(&tree,value);
302     }    
303 
304     pre_order_tree(tree,tree_node_print);
305     printf("
");
306 
307     scanf("%d",&value);
308     search_tree_delete(tree,value);
309     pre_order_tree(tree,tree_node_print);
310     printf("
");
311     
312     scanf("%d",&value);
313     search_tree_delete(tree,value);
314     pre_order_tree(tree,tree_node_print);
315     printf("
");
316     
317     scanf("%d",&value);
318     search_tree_delete(tree,value);
319     pre_order_tree(tree,tree_node_print);
320     printf("
");
321 
322     search_tree_destroy(&tree);
323     pre_order_tree(tree,tree_node_print);
324 
325 }