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