-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbst.cpp
108 lines (105 loc) · 2.45 KB
/
bst.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
#include <iostream>
using namespace std;
template <class T>
class BST {
class BSTNode;
public:
BST() { root = NULL; }
BST(const BST &src) { root = copy_subtree(src.root); }
~BST() { delete_subtree(root); }
const BST &operator=(const BST &src) {
delete_subtree(root);
root = copy_subtree(src.root);
}
void insert(const T &data) {
if (root == NULL) {
root = new BSTNode(data);
return;
}
BSTNode *walk = root;
while (walk != NULL) {
if (walk->data < data) {
if (!walk->right) {
walk->right = new BSTNode(data);
return;
}
walk = walk->right;
} else {
if (!walk->left) {
walk->left = new BSTNode(data);
return;
}
walk = walk->left;
}
}
}
int remove(const T &data) {
BSTNode **victim = &root;
while (*victim != NULL) {
if ((*victim)->data == data) break;
if ((*victim)->data < data)
victim = &((*victim)->right);
else
victim = &((*victim)->left);
}
if (!*victim) return 0;
if ((*victim)->left && (*victim)->right) {
BSTNode **donor = &((*victim)->left);
while ((*donor)->right)
donor = &((*donor)->right);
(*victim)->data = (*donor)->data;
victim = donor;
}
BSTNode *tmp = *victim;
*victim = tmp->left;
if (!*victim)
*victim = tmp->right;
/* *victim = tmp->left ? tmp->left : tmp->right */
delete tmp;
return 1;
}
int find(const T &data) const {
BSTNode *walk = root;
while (walk != NULL) {
if (walk->data == data) return 1;
if (walk->data < data)
walk = walk->right;
else
walk = walk->left;
}
return 0;
}
private:
void delete_subtree(BSTNode *r) {
if (!r) return;
cerr << "Deleting subtree " << r << " val " << r->data << endl;
delete_subtree(r->left);
delete_subtree(r->right);
delete r;
}
BSTNode *copy_subtree(BSTNode *r) {
if (!r) return NULL;
return new BSTNode(r->data, copy_subtree(r->left), copy_subtree(r->right));
}
class BSTNode {
public:
BSTNode() : data() { left = right = NULL; }
BSTNode(const T &d) : data(d) { left = right = NULL; }
BSTNode(const T &d, BSTNode *l, BSTNode *r) : data(d) { left=l; right=r; }
T data;
BSTNode *left, *right;
};
BSTNode *root;
};
int main() {
BST<int> tree;
tree.insert(5);
tree.insert(1);
tree.insert(3);
tree.insert(2);
tree.insert(8);
BST<int> tree2(tree);
tree.remove(5);
for (int i=0; i<10; i++)
cout << i << " " << tree.find(i) << endl;
}