-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBstRecADT.c
More file actions
173 lines (157 loc) · 6.1 KB
/
BstRecADT.c
File metadata and controls
173 lines (157 loc) · 6.1 KB
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
//File: BstRecADT.c
/* ΥΛΟΠΟΙΗΣΗ ΔΔΑ ΔΥΝΑΜΙΚΑ ΜΕ ΔΕΙΚΤΕΣ
ΤΑ ΣΤΟΙΧΕΙΑ ΤΩΝ ΚΟΜΒΩΝ ΤΟΥ ΔΔΑ ΕΙΝΑΙ ΤΥΠΟΥ int*
*/
#include <stdio.h>
#include <stdlib.h>
#include "BstRecADT.h"
void CreateBST(BinTreePointer *Root)
/* Λειτουργία: Δημιουργεί ένα κενό ΔΔΑ.
Επιστρέφει: Τον μηδενικό δείκτη(NULL) Root
*/
{
*Root = NULL;
}
boolean BSTEmpty(BinTreePointer Root)
/* Δέχεται: Ενα ΔΔα με το Root να δείχνει στη ρίζα του.
Λειτουργία: Ελέγχει αν το ΔΔΑ είναι κενό.
Επιστρέφει: TRUE αν το ΔΔΑ είναι κενό και FALSE διαφορετικά
*/
{
return (Root==NULL);
}
void RecBSTInsert(BinTreePointer *Root, BinTreeElementType Item)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και ένα στοιχείο Item.
Λειτουργία: Εισάγει το στοιχείο Item στο ΔΔΑ.
Επιστρέφει: Το τροποποιημένο ΔΔΑ με τον δείκτη Root να δείχνει στη ρίζα του
*/
{
if (BSTEmpty(*Root)) {
(*Root) = (BinTreePointer)malloc(sizeof (struct BinTreeNode));
(*Root) ->Data = Item;
(*Root) ->LChild = NULL;
(*Root) ->RChild = NULL;
}
else
if (Item < (*Root) ->Data)
RecBSTInsert(&(*Root) ->LChild,Item);
else if (Item > (*Root) ->Data)
RecBSTInsert(&(*Root) ->RChild,Item);
else
printf("To %d EINAI HDH STO DDA\n", Item);
}
void RecBSTSearch(BinTreePointer Root, BinTreeElementType KeyValue,
boolean *Found, BinTreePointer *LocPtr)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και μια τιμή KeyValue.
Λειτουργία: Αναζητά στο ΔΔΑ έναν κόμβο με τιμή KeyValue στο πεδίο κλειδί του.
Επιστρέφει: Η Found έχει τιμή TRUE και ο δείκτης LocPtr δείχνει στον κόμβο που
περιέχει την τιμή KeyValue, αν η αναζήτηση είναι επιτυχής.
Διαφορετικά η Found έχει τιμή FALSE
*/
{
boolean stop;
if (BSTEmpty(Root))
*Found=FALSE;
else
if (KeyValue < Root->Data)
RecBSTSearch(Root->LChild, KeyValue, &(*Found), &(*LocPtr));
else
if (KeyValue > Root->Data)
RecBSTSearch(Root->RChild, KeyValue, &(*Found), &(*LocPtr));
else
{
*Found = TRUE;
*LocPtr=Root;
}
}
void RecBSTDelete(BinTreePointer *Root, BinTreeElementType KeyValue)
/* Δέχεται: Ένα ΔΔΑ με το δείκτη Root να δείχνει στη ρίζα του και μια τιμή KeyValue.
Λειτουργία: Προσπαθεί να βρει έναν κόμβο στο ΔΔΑ που να περιέχει την τιμή
KeyValue στο πεδίο κλειδί του τμήματος δεδομένων του και,
αν τον βρει, τον διαγράφει από το ΔΔΑ.
Επιστρέφει: Το τροποποιημένο ΔΔΑ με τον δείκτη Root να δείχνει στη ρίζα του.
*/
{
BinTreePointer TempPtr; //* true AN TO STOIXEIO KeyValue EINAI STOIXEIO TOY DDA *)
if (BSTEmpty(*Root)) //* ΑΔΕΙΟ ΔΕΝΔΡΟ ΤΟ KeyValue ΔΕ ΘΑ ΒΡΕΘΕΙ *)
printf("to %d DeN BRE8HKe STO DDA\n", KeyValue);
else
//* αναζήτησε αναδρομικά τον κόμβο που περιέχει την τιμή KeyValue και διάγραψέ τον
if (KeyValue < (*Root)->Data)
RecBSTDelete(&((*Root)->LChild), KeyValue); //* ΑΡΙΣΤΕΡΟ ΥΠΟΔΕΝΔΡΟ *
else
if (KeyValue > (*Root)->Data)
RecBSTDelete(&((*Root)->RChild), KeyValue); //* ΔΕΞΙ ΥΠΟΔΕΝΔΡΟ *
else //* TO KeyValue ΒΡΕΘΗΚΕ ΔΙΑΓΡΑΦΗ ΤΟΥ ΚΟΜΒΟΥ *)
if ((*Root)->LChild ==NULL)
{
TempPtr = *Root;
*Root = (*Root)->RChild; //* ΔΕΝ ΕΧΕΙ ΑΡΙΣΤΕΡΟ ΠΑΙΔΙ *)
free(TempPtr);
}
else if ((*Root)->RChild == NULL)
{
TempPtr = *Root;
*Root = (*Root)->LChild; //* ΕΧΕΙ ΑΡΙΣΤΕΡΟ ΠΑΙΔΙ, ΑΛΛΑ ΟΧΙ ΔΕΞΙ *)
free(TempPtr);
}
else //* ΕΧΕΙ 2 ΠΑΙΔΙΑ *)
{
//* ΕΥΡΕΣΗ ΤΟΥ INORDER ΑΠΟΓΟΝΟΥ ΤΟΥ *)
TempPtr = (*Root)->RChild;
while (TempPtr->LChild != NULL)
TempPtr = TempPtr->LChild;
/* ΜΕΤΑΚΙΝΗΣΗ ΤΟΥ ΑΠΟΓΟΝΟΥ ΤΗς ΡΙΖΑΣ ΤΟΥ ΥΠΟΔΕΝΔΡΟΥ
ΠΟΥ ΕΞΕΤΑΖΕΤΑΙ ΚΑΙ ΔΙΑΓΡΑΦΗ ΤΟΥ ΑΠΟΓΟΝΟΥ ΚΟΜΒΟΥ */
(*Root)->Data = TempPtr->Data;
RecBSTDelete(&((*Root)->RChild), (*Root)->Data);
}
}
void RecBSTInorder(BinTreePointer Root)
/* Δέχεται: Ένα δυαδικό δέντρο με το δείκτη Root να δείχνει στην ρίζα του.
Λειτουργία: Εκτελεί ενδοδιατεταγμένη διάσχιση του δυαδικού δέντρου και
επεξεργάζεται κάθε κόμβο ακριβώς μια φορά.
Εμφανίζει: Το περιεχόμενο του κόμβου, και εξαρτάται από το είδος της επεξεργασίας
*/
{
if (Root!=NULL) {
printf("L");
RecBSTInorder(Root->LChild);
printf("/%d ",Root->Data,"/");
printf("R");
RecBSTInorder(Root->RChild);
}
printf("U");
}
void RecBSTPreorder(BinTreePointer Root)
/* Δέχεται: Ένα δυαδικό δέντρο με το δείκτη Root να δείχνει στην ρίζα του.
Λειτουργία: Εκτελεί προδιατεταγμένη διάσχιση του δυαδικού δέντρου και
επεξεργάζεται κάθε κόμβο ακριβώς μια φορά.
Εμφανίζει: Το περιεχόμενο του κόμβου, και εξαρτάται από το είδος της επεξεργασίας
*/
{
if (Root!=NULL) {
printf("/%d ",Root->Data,"/");
printf("L");
RecBSTPreorder(Root->LChild);
printf("R");
RecBSTPreorder(Root->RChild);
}
printf("U");
}
void RecBSTPostorder(BinTreePointer Root)
/* Δέχεται: Ένα δυαδικό δέντρο με το δείκτη Root να δείχνει στην ρίζα του.
Λειτουργία: Εκτελεί μεταδιατεταγμένη διάσχιση του δυαδικού δέντρου και
επεξεργάζεται κάθε κόμβο ακριβώς μια φορά.
Εμφανίζει: Το περιεχόμενο του κόμβου, και εξαρτάται από το είδος της επεξεργασίας
*/
{
if (Root!=NULL) {
printf("L");
RecBSTPostorder(Root->LChild);
printf("R");
RecBSTPostorder(Root->RChild);
printf("/%d ",Root->Data,"/");
}
printf("U");
}