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 | #include <iostream>
#include <algorithm>
class BinarySearchTree {
private:
struct Node {
int data;
Node* left;
Node* right;
Node(int val) : data(val), left(nullptr), right(nullptr) {}
};
Node* root;
Node* insert(Node* node, int value) {
if (node == nullptr) {
return new Node(value);
}
if (value < node->data) {
node->left = insert(node->left, value);
} else if (value > node->data) {
node->right = insert(node->right, value);
}
return node;
}
Node* search(Node* node, int value) const {
if (node == nullptr || node->data == value) {
return node;
}
if (value < node->data) {
return search(node->left, value);
}
return search(node->right, value);
}
void inorderTraversal(Node* node) const {
if (node) {
inorderTraversal(node->left);
std::cout << node->data << " ";
inorderTraversal(node->right);
}
}
Node* findMin(Node* node) const {
while (node->left != nullptr) {
node = node->left;
}
return node;
}
Node* remove(Node* node, int value) {
if (node == nullptr) {
return node;
}
if (value < node->data) {
node->left = remove(node->left, value);
} else if (value > node->data) {
node->right = remove(node->right, value);
} else {
// Node with only one child or no child
if (node->left == nullptr) {
Node* temp = node->right;
delete node;
return temp;
} else if (node->right == nullptr) {
Node* temp = node->left;
delete node;
return temp;
}
// Node with two children
Node* temp = findMin(node->right);
node->data = temp->data;
node->right = remove(node->right, temp->data);
}
return node;
}
void destroyTree(Node* node) {
if (node) {
destroyTree(node->left);
destroyTree(node->right);
delete node;
}
}
int getHeight(Node* node) const {
if (node == nullptr) {
return 0;
}
return 1 + std::max(getHeight(node->left), getHeight(node->right));
}
public:
BinarySearchTree() : root(nullptr) {}
~BinarySearchTree() { destroyTree(root); }
void insert(int value) {
root = insert(root, value);
}
bool search(int value) const {
return search(root, value) != nullptr;
}
void inorder() const {
inorderTraversal(root);
std::cout << std::endl;
}
void remove(int value) {
root = remove(root, value);
}
int height() const {
return getHeight(root);
}
};
int main() {
BinarySearchTree bst;
bst.insert(50);
bst.insert(30);
bst.insert(70);
bst.insert(20);
bst.insert(40);
bst.insert(60);
bst.insert(80);
std::cout << "Inorder traversal: ";
bst.inorder();
std::cout << "Height of the tree: " << bst.height() << std::endl;
int searchValue = 40;
std::cout << "Searching for " << searchValue << ": "
<< (bst.search(searchValue) ? "Found" : "Not Found") << std::endl;
int removeValue = 30;
std::cout << "Removing " << removeValue << std::endl;
bst.remove(removeValue);
std::cout << "Inorder traversal after removal: ";
bst.inorder();
return 0;
}
|