#include <bits/stdc++.h>
using namespace std;
class BST {
private:
struct Node {
int key;
Node* left;
Node* right;
Node(int value) {
key = value;
left = right = nullptr;
}
};
Node* root;
int sz = 0;
Node* insert(Node* root, int value) {
if (root == nullptr) return new Node(value);
if (value < root->key)
root->left = insert(root->left, value);
else
root->right = insert(root->right, value);
return root;
}
bool search(Node* root, int value) {
if (root == nullptr) return false;
if (value < root->key)
return search(root->left, value);
if (value > root->key)
return search(root->right, value);
return true;
}
Node* getMin(Node* root) {
while (root->left != nullptr) {
root = root->left;
}
return root;
}
Node* getMax(Node* root) {
while (root->right != nullptr) {
root = root->right;
}
return root;
}
void inOrder(Node* root) {
if (root == nullptr) return;
inOrder(root->left);
cout << root->key << ' ';
inOrder(root->right);
}
void preOrder(Node* root) {
if (root == nullptr) return;
cout << root->key << ' ';
preOrder(root->left);
preOrder(root->right);
}
void postOrder(Node* root) {
if (root == nullptr) return;
postOrder(root->left);
postOrder(root->right);
cout << root->key << ' ';
}
public:
BST() {
root = nullptr;
}
int size() {
return sz;
}
bool empty() {
return root == nullptr;
}
void insert(int value) {
root = insert(root, value);
sz++;
}
bool search(int value) {
return search(root, value);
}
int getMin() {
if (empty()) throw runtime_error("The BST is Empty");
return getMin(root)->key;
}
int getMax() {
if (empty()) throw runtime_error("The BST is Empty");
return getMax(root)->key;
}
bool remove(int value) {
// TO DO
return true;
}
void inOrder() {
inOrder(root);
cout << '\n';
}
void preOrder() {
preOrder(root);
cout << '\n';
}
void postOrder() {
postOrder(root);
cout << '\n';
}
};
int main()
{
BST tree;
// cout << tree.getMin() << '\n';
tree.insert(5);
tree.insert(1);
tree.insert(3);
tree.insert(7);
tree.insert(8);
cout << tree.getMin() << '\n';
cout << tree.getMax() << '\n';
// tree.search(3);
// tree.search(6);
// tree.inOrder();
// tree.preOrder();
// tree.postOrder();
return 0;
}