1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 //Real capacity is CircularQueueMaxSize -1
6 #define CircularQueueMaxSize 1000
7 #define MaxSize 1000
8
9 typedef int TreeEleType;
10 typedef struct BinarySearchTreeNode* QueueEleType;
11
12 struct BinarySearchTreeNode
13 {
14 TreeEleType Element;
15 struct BinarySearchTreeNode *Left;
16 struct BinarySearchTreeNode *Right;
17 };
18
19 struct CircularQueue
20 {
21 QueueEleType QueueData[CircularQueueMaxSize];
22 int Front;
23 int Rear;
24 };
25
26 struct BinarySearchTreeNode *BinarySearchTreeInit()
27 {
28 struct BinarySearchTreeNode *TreeRoot = NULL;
29
30 return TreeRoot;
31 }
32
33 int CircularQueueIsEmpty(struct CircularQueue *Queue)
34 {
35 return (Queue -> Front == Queue -> Rear);
36 }
37
38 int CircularQueueIsFull(struct CircularQueue *Queue)
39 {
40 return ((Queue -> Rear + 1) % CircularQueueMaxSize == Queue -> Front);
41 }
42
43 struct CircularQueue *CircularQueueInit()
44 {
45 struct CircularQueue *Queue;
46 Queue = malloc(sizeof(struct CircularQueue));
47
48 Queue -> Front = Queue -> Rear = 0;
49
50 return Queue;
51 }
52
53 //if Queue is full,return 1
54 int CircularQueueEnqueue(struct CircularQueue *Queue,QueueEleType ToBeEnqueue)
55 {
56 if(CircularQueueIsFull(Queue))
57 {
58 return 1;
59 }
60 else
61 {
62 Queue -> Rear = (Queue -> Rear + 1) % CircularQueueMaxSize;
63 Queue -> QueueData[Queue -> Rear] = ToBeEnqueue;
64 }
65 return 0;
66 }
67
68 //if Queue is empty,return NULL
69 QueueEleType CircularQueueTop(struct CircularQueue *Queue)
70 {
71 if(CircularQueueIsEmpty(Queue))
72 {
73 return NULL;
74 }
75 else
76 {
77 return Queue -> QueueData[(Queue -> Front + 1) % CircularQueueMaxSize];
78 }
79 return 0;
80 }
81
82 //if Queue is empty,return 1
83 int CircularQueueDequeue(struct CircularQueue *Queue)
84 {
85 if(CircularQueueIsEmpty(Queue))
86 {
87 return 1;
88 }
89 else
90 {
91 Queue -> Front = (Queue -> Front + 1) % CircularQueueMaxSize;
92 return 0;
93 }
94 }
95
96 int MakeCircularQueueEmpty(struct CircularQueue *Queue)
97 {
98 Queue -> Front = Queue -> Rear = 0;
99
100 return 0;
101 }
102
103 int CircularQueueDelete(struct CircularQueue *Queue)
104 {
105 free(Queue);
106 Queue = NULL;
107 return 0;
108 }
109 int BinarySearchTreeDestroy(struct BinarySearchTreeNode *TreeRoot)
110 {
111 if(TreeRoot != NULL)
112 {
113 BinarySearchTreeDestroy(TreeRoot -> Left);
114 BinarySearchTreeDestroy(TreeRoot -> Right);
115 free(TreeRoot);
116 }
117 return 0;
118 }
119
120 struct BinarySearchTreeNode *BinarySearchTreeNodeFind(TreeEleType ToBeFind,struct BinarySearchTreeNode *TreeRoot)
121 {
122 if(TreeRoot==NULL)
123 {
124 return NULL;
125 }
126
127 if(ToBeFind < TreeRoot -> Element)
128 {
129 return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Left);
130 }
131 else if(ToBeFind > TreeRoot -> Element)
132 {
133 return BinarySearchTreeNodeFind(ToBeFind,TreeRoot->Right);
134 }
135 else
136 {
137 return TreeRoot;
138 }
139 }
140
141 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMin(struct BinarySearchTreeNode *TreeRoot)
142 {
143 if(TreeRoot==NULL)
144 {
145 return NULL;
146 }
147 else if(TreeRoot->Left==NULL)
148 {
149 return TreeRoot;
150 }
151 else
152 {
153 return BinarySearchTreeNodeFindMin(TreeRoot->Left);
154 }
155 }
156
157 struct BinarySearchTreeNode *BinarySearchTreeNodeFindMax(struct BinarySearchTreeNode *TreeRoot)
158 {
159 if(TreeRoot==NULL)
160 {
161 return NULL;
162 }
163 else if(TreeRoot->Right==NULL)
164 {
165 return TreeRoot;
166 }
167 else
168 {
169 return BinarySearchTreeNodeFindMax(TreeRoot->Right);
170 }
171 }
172
173 //be careful of return NULL
174 struct BinarySearchTreeNode *BinarySearchTreeNodeInsert(TreeEleType ToBeInsert,struct BinarySearchTreeNode *TreeRoot)
175 {
176 if(TreeRoot==NULL)
177 {
178 TreeRoot = malloc(sizeof(struct BinarySearchTreeNode));
179 TreeRoot -> Element = ToBeInsert;
180 TreeRoot -> Left = TreeRoot -> Right = NULL;
181 }
182 else if(ToBeInsert < TreeRoot->Element)
183 {
184 TreeRoot -> Left = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Left);
185 }
186 else if(ToBeInsert > TreeRoot->Element)
187 {
188 TreeRoot -> Right = BinarySearchTreeNodeInsert(ToBeInsert,TreeRoot->Right);
189 }
190 return TreeRoot;
191 }
192
193 //if doesn't find,return NULL
194 struct BinarySearchTreeNode *BinarySearchTreeNodeDelete(TreeEleType ToBeDelete,struct BinarySearchTreeNode *TreeRoot)
195 {
196 if(TreeRoot == NULL)
197 return NULL;
198
199 struct BinarySearchTreeNode *TmpCell;
200
201 if(ToBeDelete < TreeRoot -> Element)
202 {
203 TreeRoot -> Left = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Left);
204 }
205 else if(ToBeDelete > TreeRoot -> Element)
206 {
207 TreeRoot -> Right = BinarySearchTreeNodeDelete(ToBeDelete,TreeRoot->Right);
208 }
209 else //if(ToBeDelete == TreeRoot -> Element)
210 {
211 if(TreeRoot->Left && TreeRoot->Right)
212 {
213 TmpCell = BinarySearchTreeNodeFindMin(TreeRoot -> Right);
214 TreeRoot -> Element = TmpCell -> Element;
215 TreeRoot -> Right = BinarySearchTreeNodeDelete(TreeRoot->Element,TreeRoot->Right);
216 }
217 else
218 {
219 TmpCell = TreeRoot;
220 if(TreeRoot->Left==NULL)
221 {
222 TreeRoot = TreeRoot -> Right;
223 }
224 else if(TreeRoot->Right==NULL)
225 {
226 TreeRoot = TreeRoot -> Left;
227 }
228 free(TmpCell);
229 }
230 }
231 return TreeRoot;
232 }
233
234 int BinarySearchTreeLevelOrder(struct BinarySearchTreeNode *TreeRoot)
235 {
236 struct CircularQueue *Queue;
237 Queue = CircularQueueInit();
238 CircularQueueEnqueue(Queue,TreeRoot);
239 while(!CircularQueueIsEmpty(Queue))
240 {
241 struct BinarySearchTreeNode *NodePtr = CircularQueueTop(Queue);
242 printf("%d ",NodePtr->Element);
243 CircularQueueDequeue(Queue);
244 if(NodePtr->Left != NULL)
245 {
246 CircularQueueEnqueue(Queue,NodePtr->Left);
247 }
248 if(NodePtr->Right != NULL)
249 {
250 CircularQueueEnqueue(Queue,NodePtr->Right);
251 }
252 }
253 return 0;
254 }
255
256 int main()
257 {
258 struct BinarySearchTreeNode *TreeRoot = BinarySearchTreeInit();
259 TreeRoot = BinarySearchTreeNodeInsert(5,TreeRoot);
260 TreeRoot = BinarySearchTreeNodeInsert(6,TreeRoot);
261 TreeRoot = BinarySearchTreeNodeInsert(3,TreeRoot);
262 TreeRoot = BinarySearchTreeNodeInsert(7,TreeRoot);
263 TreeRoot = BinarySearchTreeNodeInsert(2,TreeRoot);
264 TreeRoot = BinarySearchTreeNodeInsert(4,TreeRoot);
265 TreeRoot = BinarySearchTreeNodeInsert(1,TreeRoot);
266 BinarySearchTreeLevelOrder(TreeRoot);
267 return 0;
268 }