-
Notifications
You must be signed in to change notification settings - Fork 0
/
treeImp.cpp
311 lines (266 loc) · 7.86 KB
/
treeImp.cpp
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
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
//Pablo Marti
/*
this program will get input of a tree
as a linked list and perform operations on the tree.
Operations are
1. add node
2. delete node.
3. search for node.
4. display tree in an ordered manner.
*/
#include<iostream>
using namespace std;
//structure declaration
struct node; //forward declaration of strcture
typedef node * pNode; //using the forward declaration we can
//define a pointer node
struct node { //node structure
double info; //holds the information of the node
pNode left; //pointer to the left child
pNode right; //pointer to the right child
};
pNode root = NULL; //the root pointer
//function
//prototypes
void fillNode(node*); //function prototype to fill node
void insertNode(); //function prototype to insert node
bool searchNode(int); //function prototype for searching node
void deleteNode(); //function prototype for deleting node
void printTree( pNode , int ); //function prototype for displaying tree
//void displayTree(node*); unused function
//main
int main ()
{
int choice = 0, //int variable to hold users choice
spaces = 0, //variable used in the print function
num; //variable used in search function
//output for menu
cout << "Operations on a Binary Tree" << endl;
cout << "----------------------------------" << endl;
cout << "What would you like to do?" << endl;
cout << "1. Add Node" << endl;
cout << "2. Delete Node" << endl;
cout << "3. Search Node" << endl;
cout << "4. Display Tree" << endl;
cout << "5. Exit" << endl;
//while loop that exists when the user wants to exit
while (choice <= 5 )
{
//use enters choice for the menu
cout << "Enter Choice: ";
cin >> choice;
//switch statement for the actual menu
//correlates to the menu options pictured above.
switch (choice)
{
case 1:
insertNode();
break;
case 2:
deleteNode();
break;
case 3:
cout << "what are you searching for?" << endl;
cin >> num;
cout << searchNode(num) << endl;
break;
case 4:
if (root != NULL)
printTree(root, spaces);
else
cout << "The Tree is empty" << endl;
break;
case 5:
cout <<"Exiting..." << endl;;
choice ++;
break;
//if the user does not enter one of the designated options
default:
cout << "You did not enter a correct Operation" << endl;
choice = 0;
break;
}
}
system("pause");
return 0;
}
/*---------------------------------------------------------------------------\
| functions |
|---------------------------------------------------------------------------*/
//function used to fill node
void fillNode(node* temp)
{
//user inputs the node they would like to enter
cout << "What is the Node?" << endl;
cin >> temp->info; //sets the node to the info
temp->left = NULL; //makes left child null
temp->right = NULL; //makes right child null
}
//functino to insert node
void insertNode()
{
//node declarations for the function
node *addN, *current, *parent;
addN = new node; //makes the new node a NEW variable
fillNode(addN); //call to the fill node function
parent = NULL; //sets parent to null
//if the root is null set the root pointer to that null
if (root == NULL)
root = addN;
else
{
current = root; //set the current node to the root
while (current) //while the current node is not null
{
parent = current; //the parent is set to the current
if (addN->info > current->info) // if the new node is greater than the current node
current = current->right; //move through to the next node
else
current = current->left; //other wise the new node is less than the current
}
if (addN->info < parent->info) //is the information less than the parent node?
parent->left = addN; //if so make the left child equal to the new node
else
parent->right = addN; //otherwise set it to the right child
}
}
//function to delete a node
void deleteNode()
{
//node declarations for the function
node *current, *parent, *delParent, *delNode;
//use enters the element they want to delete
int ele;
cout << "what element would you like to delete?" << endl;
cin >> ele;
parent = root; //set the parent node equal to the root
current = NULL; //set the current to null
//this checks to see where the element is in the tree
while((parent != NULL) && (ele != parent->info))
{
current = parent;
if(ele < parent->info)
parent = parent->left; //moves parent to find the elememt
else
parent = parent->right;
}
//if the tree is empty
if(parent == NULL)
{
cout << "Key not found. Nothing deleted.\n";
return;
}
else
{
//if the parent is the root
if(parent == root)
{
delNode = root; //deletes the node
delParent = NULL; //sets delete parent to null
}
//otherwise moves delnode and delparent
else
{
delNode = parent;
delParent = current;
}
}
//if the right of the node is null
if(delNode->right == NULL)
{
//and the parent is null
if(delParent == NULL)
{
//delete that node
root = delNode->left;
delete delNode;
}
else
{
//otherwise if the left is current
if(delParent->left == delNode)
delParent->left = delNode->left; //move it ot the right
else
delParent->right = delNode->left; //move and then delete
delete delNode;
}
}
//if the right is not null
else
{
//if the left is null
if(delNode->left == NULL)
{
//and delete parent is null
if(delParent == NULL)
{
//move the root and delete the node
root = delNode->right;
delete delNode;
}
//otherwise the parent is not null
else
{
//if the left is equal to the delete node
if(delParent->left == delNode)
delParent->left = delNode->right; //move the left to the right
else
delParent->right = delNode->right; //move the right up one
delete delNode; //delete the node
}
}
else
{
//make parent the left node
parent = delNode->left;
current = delNode;
//while the right of parent is not null
while(parent->right != NULL)
{
//move parent down and to the right one
current = parent;
parent = parent->right;
}
delNode->info = parent->info;
//if they are the same move them and then delete the node
if(current == delNode)
current->left = parent->left;
else
current->right = parent->left;
delete parent;
}
}
}
//function to search for a node
bool searchNode(int data)
{
node *search;
search = root;
//while the tree is not empty
//step through the tree until the information is found
while(search != NULL)
{
if(search->info == data)
return true;
else if (data < search->info)
search = search->left;
else
search = search->right;
}
//if the node is not found
return false;
}
//function to print node in an organized manner
void printTree( pNode leaf, int spaces )
{
int i;
//if the tree is not empty
if (leaf != NULL)
{
printTree( leaf->right, spaces + 3 );
for( i = 0; i < spaces; i++ )
cout <<' ';
cout << leaf->info << endl;
printTree( leaf->left, spaces + 3 );
}
}