二叉查找树

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4  
  5 
  6 typedef int ElementType;
  7 
  8 struct TreeNode;
  9 typedef struct TreeNode *Position;
 10 typedef struct TreeNode *SearchTree;
 11 
 12 
 13 SearchTree MakeEmpty( SearchTree T );
 14 Position Find(ElementType X,SearchTree T); 
 15 Position FindMin(SearchTree T); 
 16 Position FindMax(SearchTree T); 
 17 SearchTree Insert(ElementType X, SearchTree T); 
 18 SearchTree Delete(ElementType X, SearchTree T); 
 19 ElementType RETRIVE( Position P);
 20 
 21 void PrintElement (SearchTree T); 
 22 void PreOrder(SearchTree T); 
 23 void InOrder(SearchTree T); 
 24 void PostOrder(SearchTree t);
 25 
 26  
 27 
 28 struct TreeNode 
 29 {
 30        ElementType Element;
 31     SearchTree Left;
 32     SearchTree Right;
 33 };
 34 
 35 
 36 SearchTree
 37 MakeEmpty(SearchTree T)
 38 {
 39   if( T != NULL)
 40   {
 41     MakeEmpty(T->Left);
 42     MakeEmpty(T->Right);
 43     free(T);
 44   }
 45   return NULL;
 46 }
 47 
 48  
 49 
 50 Position Find(ElementType X, SearchTree T)
 51 {
 52      if( T == NULL)
 53           return NULL;
 54      if(X < T->Element)
 55           return Find(X,T->Left);
 56      else if( X > T->Element)
 57          return Find(X, T->Right);
 58     else
 59        return T;
 60 }
 61 
 62 Position FindMin(SearchTree T)
 63 {
 64   if( T == NULL)
 65     return NULL;
 66   else if( T->Left == NULL)
 67     return T;
 68   else
 69     return FindMin(T);
 70 }
 71 
 72 
 73 Position FindMax(SearchTree T)
 74 {
 75   if( T == NULL)
 76     return NULL;
 77   else if( T->Right == NULL)
 78     return T;
 79   else return FindMax(T->Right);
 80 }
 81 
 82  
 83 
 84 SearchTree Insert(ElementType X, SearchTree T)
 85 {
 86   if(T == NULL)
 87   {
 88     T = malloc(sizeof(struct TreeNode));
 89     if( T == NULL)
 90       printf("内存分配失败");  
 91     else
 92     {
 93       T->Element = X;
 94       T->Left = T->Right = NULL;
 95     }
 96 
 97   }
 98   else if( X < T->Element)
 99     T->Left = Insert(X,T->Left);
100   else if( X > T->Element)
101     T->Right = Insert(X,T->Right);
102 
103   return T;
104 }
105 
106  
107 
108  
109 
110 SearchTree Delete(ElementType X, SearchTree T)
111 {
112   Position Tmpcell;
113   if( T == NULL)
114     printf("ERROR ");
115   else if( X < T->Element)
116     T->Left = Delete(X,T->Left);
117   else if( X > T->Element)
118     T->Right = Delete(X,T->Right);
119   else if(T->Left && T->Right)
120   {
121     Tmpcell = FindMin( T->Right);
122     T->Element = Tmpcell->Element;
123     T->Right = Delete(T->Element,T->Right);
124   }
125   else
126   {
127       Tmpcell = T;;
128       if( T->Left == NULL)
129       T =T->Right;
130       else if(T->Right == NULL)
131       T =T->Left;
132       free(Tmpcell);
133   }
134   return T;
135 }
136 
137  
138 
139 ElementType RETRIVE(Position P)
140 {
141   return P->Element;
142 }
143 
144 oid PrintElement (SearchTree T)
145 {
146     printf("%3d ",RETRIVE(T));
147 }
148 
149 void PreOrder(SearchTree T)
150 {
151   if( T != NULL)
152   {
153     PrintElement(T);
154     PreOrder(T->Left);
155     PreOrder(T->Right);
156   }
157 }
158 
159 
160 void InOrder(SearchTree T)
161 {
162     if( T != NULL)
163     {
164     InOrder( T->Left);
165     PrintElement(T);
166     InOrder(T->Right);
167     }
168 }
169 
170  
171 
172 oid PostOrder(SearchTree T)
173 {
174   if(T != NULL)
175   {
176     PostOrder(T->Left);
177     PostOrder(T->Right);
178     PrintElement(T);
179   }
180 }
181 
182 
183 int main()
184 {
185 SearchTree T = NULL;
186 int i, j, m, n;
187 ElementType tmp;
188 printf( "Number of Elements:" );
189 scanf( "%d", &n );
190 for ( i = 0; i < n; i++)
191 {
192 scanf( "%d", &tmp );
193 T = Insert( tmp, T );
194 }
195 printf( "\nPreOrder :" );
196 PreOrder( T );
197 printf( "\nInOrder :" );
198 InOrder( T );
199 printf( "\nPostOrder:" );
200 PostOrder( T );
201 printf( "\n" );
202 return 0;
203 }
204 
205  

 

 

 

 

 

 

 

posted @ 2012-09-13 22:39  风去无痕  阅读(208)  评论(0编辑  收藏  举报