Cod sursa(job #1730152)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 16 iulie 2016 14:07:29
Problema Hashuri Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.49 kb
#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;
}