Pagini recente » Cod sursa (job #3139181) | Cod sursa (job #3159809) | Cod sursa (job #707635) | Cod sursa (job #778065) | Cod sursa (job #1730152)
#include <iostream>
#include <cassert>
#include <algorithm>
class BinarySearchTree {
class BinarySearchTreeNode;
private:
BinarySearchTreeNode *root;
public:
BinarySearchTree() {
root = nullptr;
}
void InsertValue(int value) {
root = DoInsertValue(root, value);
}
void RemoveValue(int value) {
root = DoRemoveValue(root, value);
}
bool SearchValue(int value) {
return DoSearchValue(root, value);
}
private:
BinarySearchTreeNode* DoInsertValue(BinarySearchTreeNode *node, int value) {
if (node == nullptr) {
return new BinarySearchTreeNode(value);
}
if (value == node->value) {
return node;
}
if (value < node->value) {
node->left_son = DoInsertValue(node->left_son, value);
} else {
node->right_son = DoInsertValue(node->right_son, value);
}
return node;
}
bool DoSearchValue(BinarySearchTreeNode *node, int value) {
if (node == nullptr) {
return false;
}
if (value == node->value) {
return true;
}
if (value < node->value) {
return DoSearchValue(node->left_son, value);
}
return DoSearchValue(node->right_son, value);
}
BinarySearchTreeNode* DoRemoveValue(BinarySearchTreeNode *node, int value) {
if (node == nullptr) {
return nullptr;
}
if (value != node->value) {
if (value < node->value) {
node->left_son = DoRemoveValue(node->left_son, value);
} else {
node->right_son = DoRemoveValue(node->right_son, value);
}
return node;
}
if (node->left_son == nullptr && node->right_son == nullptr) {
free(node);
return nullptr;
}
if (node->right_son == nullptr) {
free(node);
return node->left_son;
}
if (node->left_son == nullptr) {
free(node);
return node->right_son;
}
BinarySearchTreeNode *left_most_from_right = DoFindLeftMost(node->right_son);
std::swap(left_most_from_right->value, node->value);
node->right_son = DoRemoveValue(node->right_son, value);
return node;
}
BinarySearchTreeNode* DoFindLeftMost(BinarySearchTreeNode *node) {
if (node->left_son == nullptr) {
return node;
}
return DoFindLeftMost(node->left_son);
}
class BinarySearchTreeNode {
public:
int value;
BinarySearchTreeNode *left_son, *right_son;
BinarySearchTreeNode(int value) {
this->value = value;
left_son = right_son = nullptr;
}
};
};
int main() {
int operations;
std::cin >> operations;
BinarySearchTree tree;
while (operations--) {
int type, value;
std::cin >> type >> value;
if (type == 1) {
tree.InsertValue(value);
} else if (type == 2) {
tree.RemoveValue(value);
} else if (type == 3) {
std::cout << tree.SearchValue(value) << "\n";
} else {
assert(false);
}
}
return 0;
}