-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patha33f5.c
268 lines (232 loc) · 9.88 KB
/
a33f5.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
#include <stdio.h>
#include <stdlib.h>
typedef int BinTreeElementType; /*ο τύπος των στοιχείων του ΔΔΑ
ενδεικτικά τύπου int */
typedef struct BinTreeNode *BinTreePointer;
typedef struct BinTreeNode {
BinTreeElementType Data;
BinTreePointer LChild, RChild;
} BinTreeNode;
typedef enum {
FALSE, TRUE
} boolean;
void CreateBST(BinTreePointer *Root);
boolean EmptyBST(BinTreePointer Root);
void BSTInsert(BinTreePointer *Root, BinTreeElementType Item);
void BSTSearch(BinTreePointer Root, BinTreeElementType KeyValue, boolean *Found, BinTreePointer *LocPtr);
void BSTSearch2(BinTreePointer Root, BinTreeElementType KeyValue, boolean *Found,
BinTreePointer *LocPtr, BinTreePointer *Parent);
void BSTDelete(BinTreePointer *Root, BinTreeElementType KeyValue);
void InorderTraversal(BinTreePointer Root);
int MaxBSTValue(BinTreePointer Root);
int MinBSTValue(BinTreePointer Root);
int main(){
BinTreePointer Tree1, Tree2;
int number, min1, min2, max1, max2;
char bin;
CreateBST(&Tree1);
CreateBST(&Tree2);
while(TRUE){
printf("Dwse enan thetiko akeraio: ");
scanf("%d%c", &number, &bin);
if(number == -1){ break; }
if(number % 2 != 0){
BSTInsert(&Tree1, number);
}else{
BSTInsert(&Tree2, number);
}
}
min1 = MinBSTValue(Tree1);
max1 = MaxBSTValue(Tree1);
min2 = MinBSTValue(Tree2);
max2 = MaxBSTValue(Tree2);
printf("H mikroterh timh toy DDA peritvn ariyhmwn einai: %d\n", min1);
printf("H megalyterh timh toy DDA peritvn ariyhmwn einai: %d\n", max1);
printf("H mikroterh timh toy DDA artiwn ariyhmwn einai: %d\n", min2);
printf("H megalyterh timh toy DDA artiwn ariyhmwn einai: %d\n", max2);
return 0;
}
void CreateBST(BinTreePointer *Root)
/* Λειτουργία: Δημιουργεί ένα κενό ΔΔΑ.
Επιστρέφει: Τον μηδενικό δείκτη(NULL) Root
*/
{
*Root = NULL;
}
boolean EmptyBST(BinTreePointer Root)
/* Δέχεται: Ενα ΔΔα με το Root να δείχνει στη ρίζα του.
Λειτουργία: Ελέγχει αν το ΔΔΑ είναι κενό.
Επιστρέφει: TRUE αν το ΔΔΑ είναι κενό και FALSE διαφορετικά
*/
{ return (Root==NULL);
}
void BSTInsert(BinTreePointer *Root, BinTreeElementType Item)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και ένα στοιχείο Item.
Λειτουργία: Εισάγει το στοιχείο Item στο ΔΔΑ.
Επιστρέφει: Το τροποποιημένο ΔΔΑ με τον δείκτη Root να δείχνει στη ρίζα του
*/
{
BinTreePointer LocPtr, Parent;
boolean Found;
LocPtr = *Root;
Parent = NULL;
Found = FALSE;
while (!Found && LocPtr != NULL) {
Parent = LocPtr;
if (Item < LocPtr->Data)
LocPtr = LocPtr ->LChild;
else if (Item > LocPtr ->Data)
LocPtr = LocPtr ->RChild;
else
Found = TRUE;
}
if (Found)
printf("TO STOIXEIO EINAI HDH STO DDA\n");
else {
LocPtr = (BinTreePointer)malloc(sizeof (struct BinTreeNode));
LocPtr ->Data = Item;
LocPtr ->LChild = NULL;
LocPtr ->RChild = NULL;
if (Parent == NULL)
*Root = LocPtr;
else if (Item < Parent ->Data)
Parent ->LChild = LocPtr;
else
Parent ->RChild = LocPtr;
}
}
void BSTSearch(BinTreePointer Root, BinTreeElementType KeyValue, boolean *Found,
BinTreePointer *LocPtr)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και μια τιμή KeyValue.
Λειτουργία: Αναζητά στο ΔΔΑ έναν κόμβο με τιμή KeyValue στο πεδίο κλειδί του.
Επιστρέφει: Η Found έχει τιμή TRUE και ο δείκτης LocPtr δείχνει στον κόμβο που
περιέχει την τιμή KeyValue, αν η αναζήτηση είναι επιτυχής.
Διαφορετικά η Found έχει τιμή FALSE
*/
{
(*LocPtr) = Root;
(*Found) = FALSE;
while (!(*Found) && (*LocPtr) != NULL)
{
if (KeyValue < (*LocPtr)->Data)
(*LocPtr) = (*LocPtr)->LChild;
else
if (KeyValue > (*LocPtr)->Data)
(*LocPtr) = (*LocPtr)->RChild;
else (*Found) = TRUE;
}
}
void BSTSearch2(BinTreePointer Root, BinTreeElementType KeyValue, boolean *Found,
BinTreePointer *LocPtr, BinTreePointer *Parent)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και μια τιμή KeyValue.
Λειτουργία: Αναζητά στο ΔΔΑ έναν κόμβο με τιμή KeyValue στο πεδίο κλειδί του
και τον πατέρα του κόμβου αυτού.
Επιστρέφει: Η Found έχει τιμή TRUE, ο δείκτης LocPtr δείχνει στον κόμβο που
περιέχει την τιμή KeyValue και ο Parent δείχνει στον πατέρα
αυτού του κόμβου, αν η αναζήτηση είναι επιτυχής.
Διαφορετικά η Found έχει τιμή FALSE.
*/
{
*LocPtr = Root;
*Parent=NULL;
*Found = FALSE;
while (!(*Found) && *LocPtr != NULL)
{
if (KeyValue < (*LocPtr)->Data) {
*Parent=*LocPtr;
*LocPtr = (*LocPtr)->LChild;
}
else
if (KeyValue > (*LocPtr)->Data) {
*Parent=*LocPtr;
*LocPtr = (*LocPtr)->RChild;
}
else *Found = TRUE;
}
}
void BSTDelete(BinTreePointer *Root, BinTreeElementType KeyValue)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και μια τιμή KeyValue.
Λειτουργία: Προσπαθεί να βρει έναν κόμβο στο ΔΔΑ που να περιέχει την τιμή
KeyValue στο πεδίο κλειδί του τμήματος δεδομένων του και,
αν τον βρει, τον διαγράφει από το ΔΔΑ.
Επιστρέφει: Το τροποποιημένο ΔΔΑ με τον δείκτη Root να δείχνει στη ρίζα του.
*/
{
BinTreePointer
n, //δείχνει στον κόμβο που περιέχει την τιμή KeyValue *)
Parent, // πατέρας του n ή του nNext
nNext, // ενδοδιατεταγμένος επόμενος του n
SubTree; // δείκτης προς υποδέντρο του n
boolean Found; // TRUE AN TO ΣΤΟΙΧΕΙΟ KeyValue EINAI ΣΤΟΙΧΕΟ ΤΟΥ ΔΔΑ *)
BSTSearch2(*Root, KeyValue, &Found , &n, &Parent);
if (!Found)
printf("TO STOIXEIO DEN EINAI STO DDA\n");
else {
if (n->LChild != NULL && n->RChild != NULL)
{ // κόμβος προς διαγραφή με δύο παιδιά
//Βρες τον ενδοδιατεταγμένο επόμενο και τον πατέρα του
nNext = n->RChild;
Parent = n;
while (nNext->LChild !=NULL) //* DIASXISH PROS TA ARISTERA *)
{
Parent = nNext;
nNext = nNext->LChild;
}
/* Αντιγραφή των περιεχομένων του nNext στον n και
αλλαγή του n ώστε να δείχνει στον επόμενο */
n->Data = nNext->Data;
n = nNext;
} //Συνεχίζουμε με την περίπτωση που ο κόμβος έχει το πολύ 1 παιδί
SubTree = n->LChild;
if (SubTree == NULL)
SubTree = n->RChild;
if (Parent == NULL) //* 8A DIAGRAFEI H RIZA *)
*Root = SubTree;
else if (Parent->LChild == n)
Parent->LChild = SubTree;
else
Parent->RChild = SubTree;
free(n);
}
}
void InorderTraversal(BinTreePointer Root)
/* Δέχεται: Ένα δυαδικό δέντρο με το δείκτη Root να δείχνει στην ρίζα του.
Λειτουργία: Εκτελεί ενδοδιατεταγμένη διάσχιση του δυαδικού δέντρου και
επεξεργάζεται κάθε κόμβο ακριβώς μια φορά.
Εμφανίζει: Το περιεχόμενο του κόμβου, και εξαρτάται από το είδος της επεξεργασίας
*/
{
if (Root!=NULL) {
InorderTraversal(Root->LChild);
printf("%d ",Root->Data);
InorderTraversal(Root->RChild);
}
}
int MinBSTValue(BinTreePointer Root){
int min;
BinTreePointer LocPtr;
LocPtr = Root;
while(TRUE){
if(LocPtr ->LChild == NULL){
min = LocPtr ->Data;
break;
}else{
LocPtr = LocPtr ->LChild;
}
}
return min;
}
int MaxBSTValue(BinTreePointer Root){
int max;
BinTreePointer LocPtr;
LocPtr = Root;
while(TRUE){
if(LocPtr ->RChild == NULL){
max = LocPtr ->Data;
break;
}else{
LocPtr = LocPtr ->RChild;
}
}
return max;
}