(C語言)BinarySrearchTree二叉搜索樹 --- 標準插入(遞歸,非遞歸)、遍歷(前,中,後序)、查找(遞歸,非遞歸)、根插入遞歸(左旋,右旋)、最小最大值、刪除節點

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 
  4 struct node{
  5         int data;
  6         struct node *left;
  7         struct node *right;
  8 };
  9 
 10 struct node *creatNode(int value);
 11 void insertNode(struct node **head, struct node *new);
 12 //void insertRootNode(struct node **head, struct node *new);
 13 struct node *insertRootNode(struct node *head, struct node *new);
 14 void print(struct node *p);
 15 void traverse(struct node *p, void (*fun)(struct node *));
 16 struct node *search(struct node *head, int value);
 17 
 18 struct node *findMin(struct node *head);
 19 struct node *findMax(struct node *head);
 20 struct node *deleteNode(struct node *head, int value);
 21 
 22 int main(int argc, char *argv[])
 23 {
 24         int a[6];
 25         struct node *head = NULL;
 26         int i;
 27         //srand(time(NULL));
 28         for(i=0; i<6; i++)
 29         {
 30                 a[i] = rand()%100;
 31                 printf("%d ", a[i]);
 32         }
 33         printf("\n");
 34 
 35         for(i=0; i<6; i++)
 36                 //insertRootNode(&head, creatNode(a[i]));
 37                 head = insertRootNode(head, creatNode(a[i]));
 38         // insertNode(&head, creatNode(100));
 39         traverse(head, print);
 40         printf("\n");
 41         print(search(head, 93));
 42         printf("\n");
 43         //print(findMin(head));
 44         //print(findMax(head));
 45         traverse(deleteNode(head, 83), print);
 46         return 0;
 47 }
 48 
 49 // 新建一個節點
 50 struct node *creatNode(int value)
 51 {
 52         struct node *p;
 53         p = (struct node *)malloc(sizeof(struct node));
 54         p->data = value;
 55         p->left = NULL; p->right = NULL;
 56         return p;
 57 }
 58 
 59 // 標準插入,遞歸插入節點,構建二叉樹
 60 void insertNode_recursive(struct node **head, struct node *new)
 61 {
 62         struct node *p;
 63         p = *head;
 64         if(p == NULL)
 65                 *head = new;
 66         else
 67         {
 68                 if(new->data < p->data)
 69                         insertNode(&(p->left), new);
 70                 else
 71                         insertNode(&(p->right), new);
 72         }
 73 }
 74 
 75 // 非遞歸插入節點,構建二叉樹
 76 void insertNode(struct node **head, struct node *new)
 77 {
 78         struct node *p;
 79         p = *head;
 80         if(p == NULL)
 81         {
 82                 *head = new;
 83         }
 84         else
 85         {
 86                 struct node *temp;
 87                 while(p != NULL)
 88                 {
 89                         temp = p;
 90                         p = (new->data < p->data) ? p->left : p->right;
 91                 }
 92                 if(new->data < temp->data)
 93                         temp->left = new;
 94                 else
 95                         temp->right = new;
 96         }
 97 }
 98 
 99 // 節點打印函數,設置所需格式
100 void print(struct node *p)
101 {
102         printf("%d ", p->data);
103 }
104 
105 // 遞歸遍歷二叉樹,打印輸出
106 void traverse(struct node *p, void (*fun)(struct node *))
107 {
108         if(p == NULL)
109                 return ;
110         traverse(p->left, fun);
111         (*fun)(p);
112         traverse(p->right, fun);
113 }
114 
115 // 查找,遞歸
116 struct node *search_recursive(struct node *head, int value)
117 {
118         if(head == NULL)
119                 return NULL;
120         if(head->data == value)
121                 return head;
122         else if(head->data > value)
123                 search(head->left, value);
124         else
125                 search(head->right, value);
126 }
127 
128 // 查找,非遞歸
129 struct node *search(struct node *head, int value)
130 {
131         struct node *p = head;
132         while(p != NULL)
133         {
134                 if(p->data == value)
135                         return p;
136                 else if(p->data > value)
137                         p = p->left;
138                 else
139                         p = p->right;
140         }
141         return NULL;
142 }
143 
144 /* === 根插入的二叉樹:左旋、右旋 === */
145 
146 // 右旋
147 struct node *rotRight(struct node *head)
148 {
149         struct node *new;
150         new = head->left;
151         head->left = new->right;
152         new->right = head;
153         return new;
154 }
155 
156 // 左旋
157 struct node *rotLeft(struct node *head)
158 {
159         struct node *new;
160         new = head->right;
161         head->right = new->left;
162         new->left = head;
163         return new;
164 }
165 
166 // 根插入,遞歸,無返回值
167 /*
168 void insertRootNode(struct node **head, struct node *new)
169 {
170         struct node *p;
171         p = *head;
172         if(p == NULL)
173                 *head = new;
174         else
175         {
176                 if(new->data < p->data)
177                 {
178                         insertRootNode(&(p->left), new);
179                         *head = rotRight(p);
180                 }
181                 else
182                 {
183                         insertRootNode(&(p->right), new);
184                         *head = rotLeft(p);
185                 }
186         }
187 }
188 */
189 // 根插入,遞歸,有返回值
190 struct node *insertRootNode(struct node *head, struct node *new)
191 {
192         if(head == NULL)
193                 return new;
194         if(new->data < head->data)
195         {
196                 head->left = insertRootNode(head->left, new);
197                 head = rotRight(head);
198         }
199         else
200         {
201                 head->right = insertRootNode(head->right, new);
202                 head = rotLeft(head);
203         }
204         return head;
205 }
206 // 最小值,遞歸
207 struct node *findMin(struct node *head)
208 {
209         if(head==NULL || head->left==NULL)
210                 return head;
211         findMin(head->left);
212 }
213 // 最大值,非遞歸
214 struct node *findMax(struct node *head)
215 {
216         if(head==NULL)
217                 return head;
218         while(head->right != NULL)
219                 head = head->right;
220         return head;
221 }
222 // 刪除節點
223 struct node *deleteNode(struct node *head, int value)
224 {
225         if(head == NULL)
226                 return head;
227         if(value < head->data)
228                 head->left = deleteNode(head->left, value);
229         else if(value > head->data)
230                 head->right = deleteNode(head->right, value);
231         else    // 找到需要刪除的節點
232                 if(head->left && head->right)   // 該節點有兩個孩子
233                 {       // 直接將該節點的數值替換爲其右子數中的最小值,然後刪除該最小值的節點
234                         struct node *temp = findMin(head->right);
235                         head->data = temp->data;
236                         head->right = deleteNode(head->right, temp->data);
237                 }
238                 else
239                 {
240                         if(head->left == NULL)
241                         {       // head只是一個 變量,它指向一塊內存區域
242                                 struct node *del = head;
243                                 head = head->right;
244                                 free(del);
245                         }
246                         else if(head->right == NULL)
247                         {
248                                 struct node *del = head;
249                                 head = head->left;
250                                 free(del);
251                         }
252                         else
253                                 free(head);
254                 }
255         return head;
256 }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章