-
Notifications
You must be signed in to change notification settings - Fork 9
/
Copy pathtest0.cpp
121 lines (107 loc) · 2.65 KB
/
test0.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
// vim:fileencoding=gbk
#include "pch.h"
#include <cassert>
template<typename T>
class BinarySearchTree
{
private:
struct Node
{
Node(const T&val, Node* left = NULL, Node *right = NULL) {
this->val = val;
this->left = left;
this->right = right;
}
Node *left, *right;
T val;
};
public:
BinarySearchTree() : m_root(NULL), m_size(0) {}
~BinarySearchTree() { rdeleteNode(m_root); }
bool empty() const { return size() == 0; }
int size() const { return m_size; }
bool insert(const T& val)
{
Node** node = searchNode(val);
if (*node != NULL) return false;
*node = new Node(val);
++m_size;
return true;
}
bool erase(const T& val)
{
Node** pnode = searchNode(val);
Node *node = *pnode;
if (node == NULL) return false;
if (node->left != NULL && node->right != NULL) {
pnode = minNode(&node->right);
node->val = (*pnode)->val;
*pnode = (*pnode)->right;
delete *pnode;
}
else {
*pnode = node->left != NULL ? node->left : node->right;
delete node;
}
--m_size;
return true;
}
bool search(const T& val) const
{
return *const_cast<BinarySearchTree*>(this)->searchNode(val) != NULL;
}
private:
static void rdeleteNode(Node *n)
{
if (n == NULL) return;
rdeleteNode(n->left);
rdeleteNode(n->right);
delete n;
}
static Node** minNode(Node **pn)
{
assert(pn != NULL);
while ((*pn)->left != NULL) pn = &(*pn)->left;
return pn;
}
Node** searchNode(const T& val)
{
Node **pcur = &m_root;
while (*pcur != NULL) {
if ((*pcur)->val == val) return pcur;
else if (val < (*pcur)->val) pcur = &(*pcur)->left;
else pcur = &(*pcur)->right;
}
return pcur;
}
private:
Node *m_root;
int m_size;
};
void basic_test()
{
BinarySearchTree<int> tree;
for (int i = 0; i < 15; i += 3) tree.insert(i);
assert(tree.size() == 5);
assert(tree.search(3));
assert(tree.search(12));
assert(!tree.search(10));
assert(!tree.erase(8));
assert(tree.search(9));
assert(tree.erase(9));
assert(!tree.erase(9));
assert(tree.size() == 4);
assert(!tree.insert(3));
assert(tree.insert(13));
assert(tree.size() == 5);
assert(tree.erase(13));
assert(tree.erase(12));
assert(tree.erase(6));
assert(tree.erase(3));
assert(tree.erase(0));
assert(tree.empty());
}
int main()
{
basic_test();
}