码迷,mamicode.com
首页 > 编程语言 > 详细

算法10---二叉搜索树

时间:2016-09-22 21:09:16      阅读:239      评论:0      收藏:0      [点我收藏+]

标签:

算法10---二叉搜索树

 

搜索树数据结构支持许多动态集合操作,包括search,minimum,maximum,predecessor,successor,insert和delete等。
 
概念:二叉搜索树。对于任何节点x,其左子树中的关键字最大不超过x.key,其右子树中的关键字最小不低于x.key。其运行实际和树的高度成正比;
 
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 #ifndef _Tree_H
  5 
  6 struct treenode;
  7 typedef  struct treenode *position;
  8 typedef struct treenode *searchtree;
  9 
 10 
 11 
 12 searchtree makeempty(searchtree T);//二叉搜索树置空
 13 position find(searchtree T,int key);//在二叉搜索树内查找key
 14 position find_in_recursion(searchtree T,int key);//递归查找
 15 position findmin(searchtree T);//找二叉搜索树内最小值
 16 position findmax(searchtree T);//找二叉搜索树内最大值
 17 searchtree tree_successor(searchtree T);//二叉搜索树内后继节点
 18 searchtree tree_predecessor(searchtree T);//二叉搜索树内前驱
 19 
 20 position insertposition(searchtree T,int key);//用于找到key值的插入点
 21 void insert(searchtree T,int key);//插入值,非递归方法
 22 searchtree insert_recursion(searchtree T,int key);//递归方法插入值
 23 void transplant(searchtree T,position u,position v);//使用节点v代替u
 24 void tree_delete(searchtree T,int key);//
 25 
 26 void inorder_tree_work(searchtree T);//中序遍历二叉搜索树
 27 
 28 
 29 #endif
 30 
 31 
 32 typedef struct treenode
 33 {
 34     int key;
 35     int data;
 36     searchtree left;
 37     searchtree right;
 38     searchtree parent;
 39 }treenode;
 40 
 41 
 42 //中序遍历
 43 void inorder_tree_work(searchtree T)
 44 {
 45     if (T!=NULL)
 46     {
 47         inorder_tree_work(T->left);
 48         printf("%d\n",T->key);
 49         inorder_tree_work(T->right);
 50     }
 51 }
 52 
 53 
 54 //清空搜索树
 55 
 56 searchtree makeempty(searchtree T)
 57 {
 58     if (T!=NULL)
 59     {
 60         makeempty(T->left);
 61         makeempty(T->right);
 62         free(T);
 63     }
 64     return NULL;
 65 }
 66 
 67 //查找,一种方法是递归,一种方法是非递归
 68 //我们先采用递归的方法
 69 position find(searchtree T,int key)
 70 {
 71     if (T==NULL||key==T->key)
 72     {
 73         return T;
 74     }
 75     if (key<T->key)
 76     {
 77         return find(T->left,key);
 78     }
 79     else
 80         return find(T->right,key);
 81 }
 82 
 83 
 84 position find_in_recursion(searchtree T,int key)
 85 {
 86     while (T!=NULL&&key!=T->key)
 87     {
 88         if (key<T->key)
 89         {
 90             T=T->left;
 91         }
 92         else
 93             T=T->right;
 94     }
 95     return T;
 96 }
 97 
 98 
 99 //找二叉搜索树中的最大值和最小值也有递归和非递归的方法,不过我们在这采用非递归的方法;
100 
101 position findmin(searchtree T)
102 {
103     while (T->left!=NULL)
104     {
105         T=T->left;
106     }
107     return T;
108 }
109 
110 position findmax(searchtree T)
111 {
112     while (T->right!=NULL)
113     {
114         T=T->right;
115     }
116     return T;
117 }
118 
119 
120 //找二叉搜索树的前驱和后驱节点
121 
122 position tree_successor(position T)
123 {
124     if (T->right!=NULL)
125     {
126         return findmax(T->right);
127     }
128     position y;
129     y=T->parent;
130     while(y!=NULL&&T==y->right)
131     {
132         T=y;
133         y=y->parent;
134     }
135     return y;
136 }
137 
138 position tree_predecessor(position T)
139 {
140     if (T->right!=NULL)
141     {
142         return findmin(T->left);
143     }
144     position y;
145     y=T->parent;
146     while(y!=NULL&&T==y->left)
147     {
148         T=y;
149         y=y->parent;
150     }
151     return y;
152 }
153 
154 //先采用递归的方法
155 
156 searchtree insert_recursion(searchtree T,int key)
157 {
158     if (T==NULL)
159     {
160         T=(treenode *)malloc(sizeof(struct treenode));
161         if (T==NULL)
162         {
163             printf("out of space!\n");
164             return NULL;
165         }
166         else
167         {
168             T->key=key;
169             T->left=T->right=NULL;
170         }
171     }
172     else if (key<T->key)
173     {
174         T->left=insert_recursion(T->left,key);
175     }
176     else
177         T->right=insert_recursion(T->right,key);
178 
179 
180     return T;
181 
182 }
183 
184 position insertposition(searchtree T,int key)
185 {
186     position s;
187     position p = T;
188     while(p!=NULL)
189     {
190         s=p;
191         if (p->key==key)
192         {
193             return NULL;
194         }
195         p=(key<p->key)? p->left:p->right;
196     }
197     return s;
198 }
199 
200 void insert(searchtree T,int key )
201 {
202     position p=insertposition(T,key);
203     position y=NULL;
204     position x=T;
205     while(x!=NULL)
206     {
207         y=x;
208         if (key<x->key)
209         {
210             x=x->left;
211         }
212         else
213             x=x->right;
214     }
215     p->parent=y;
216     if (y==NULL)
217     {
218         T=p;
219     }
220     else if (p->key<y->key)
221     {
222         y->left=p;
223     }
224     else
225         y->right=p;
226 
227 }
228 
229 //二叉搜索树的删除操作
230 void transplant(searchtree T,position u,position v)//使用节点v代替u
231 {
232     if (u->parent==NULL)
233     {
234         T=u;
235     }
236     else if (u==u->parent->left)
237     {
238         u->parent->left=v;
239     }
240     else
241         u->parent->right=v;
242     if (v!=NULL)
243     {
244         v->parent=u->parent;
245     }
246 }
247 
248 void tree_delete(searchtree T,int key)//二叉搜索树的删除操作
249 {
250     position p=insertposition(T,key);
251     if (p->left==NULL)
252         transplant(T,p,p->right);
253     else if (p->right==NULL)
254         transplant(T,p,p->left);
255     else
256     {
257         position y=findmin(p->right);
258         if (y->parent!=p)
259         {
260             transplant(T,y,y->right);
261             y->right=p->right;
262             y->right->parent=y;
263         }
264         transplant(T,p,y);
265         y->left=p->left;
266         y->left->parent=y;
267     }   
268 }
269 
270 int main()
271 {
272     return 0;
273 
274 }

 

算法10---二叉搜索树

标签:

原文地址:http://www.cnblogs.com/tao-alex/p/5897810.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!