-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbstree.cpp
132 lines (121 loc) · 2.51 KB
/
bstree.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
#ifndef BSTREE_CPP
#define BSTREE_CPP
#include <cstddef>
#include <algorithm>
#include <iostream>
#include <cmath>
template<typename T>
class BSTree {
struct Node {
T value;
Node* left;
Node* right;
Node* parent;
Node() {
left = NULL;
right = NULL;
parent = NULL;
}
Node(T v, Node* p) {
Node();
value = v;
parent = p;
}
void insert(T v) {
if(v < value) {
if(left == NULL)
left = new Node(v, this);
else
left -> insert(v);
} else {
if(right == NULL)
right = new Node(v, this);
else
right -> insert(v);
}
}
Node* findNode(T v) {
if(v == value) return this;
if(v < value) {
if(left == NULL) return NULL;
return left -> findNode(v);
} else {
if(right == NULL) return NULL;
return right -> findNode(v);
}
}
bool search(T v) {
return findNode(v) != NULL;
}
};
public: // tmp
Node* root;
public:
BSTree() {
root = NULL;
}
void insert(T v) {
if(root == NULL)
root = new BSTree<T>::Node(v, NULL);
else
root -> insert(v);
}
bool search(T v) {
if(root == NULL) return false;
else return root -> search(v);
}
void remove(T v) {
// TODO if root is NULL
Node* node = root -> findNode(v);
// TODO if didn't find a node
// no children
if(node -> left == NULL && node -> right == NULL) {
if(node -> parent != NULL) { // if not a root
if(node -> parent -> left == node) {
node -> parent -> left = NULL;
} else {
node -> parent -> right = NULL;
}
}
delete node;
return;
}
// 1 child
if(node -> right == NULL) { // if deleted node has left child
node -> left -> parent = node -> parent;
if(node -> parent -> left == node) {
node -> parent -> left = node -> left;
} else {
node -> parent -> right = node -> left;
}
delete node;
return;
}
if(node -> left == NULL) { // if deleted node has left child
node -> right -> parent = node -> parent;
if(node -> parent -> left == node) {
node -> parent -> left = node -> right;
} else {
node -> parent -> right = node -> right;
}
delete node;
return;
}
// 2 children
Node* swap = node -> right;
while(swap -> left != NULL) swap = swap -> left;
node -> value = swap -> value;
if(swap -> parent != NULL) { // if not a root
if(swap -> parent -> left == swap) {
swap -> parent -> left = NULL;
} else {
swap -> parent -> right = NULL;
}
}
delete swap;
}
// necessary to use BSTreePrinter
template<typename BSTP_T>
friend class BSTreePrinter;
};
#endif