//MyTree.h
#include <iostream>
struct Node{
int data;
Node *left;
Node *right;
};
class MyTree{
public:
MyTree(); // constructor
~MyTree(); // destructor
void insert(int);
void remove(int);
void print();
void search(int);
private:
Node* root;
Node* makeEmpty(Node*);
Node* insert(int, Node*);
Node* findMin(Node*);
Node* findMax(Node*);
Node* remove(int, Node *);
void inorder(Node*);
Node* find(Node*, int val);
};
MyTree::MyTree(){
root = nullptr;
}
MyTree::~MyTree(){
root = makeEmpty(root);
}
void MyTree::insert(int val){
root = insert(val, root);
}
void MyTree::remove(int val){
root = remove(val, root);
}
void MyTree::print(){
inorder(root);
std::cout << "\n";
}
void MyTree::search(int val){
root = find(root, val);
}
Node* MyTree::makeEmpty(Node *temp_node){
if(temp_node == nullptr)
return nullptr;
makeEmpty(temp_node->left);
makeEmpty(temp_node->right);
delete temp_node;
return nullptr;}
Node* MyTree::insert(int val, Node *temp_node){
if(temp_node == nullptr){
temp_node = new Node;
temp_node->data = val;
temp_node->left = temp_node->right = nullptr;
} else if(val < temp_node->data){
temp_node->left = insert(val, temp_node->left);
} else if(val > temp_node->data){
temp_node->right = insert(val, temp_node->right);
}
return temp_node;
}
Node* MyTree::findMin(Node *temp_node){
if(temp_node == nullptr)
return nullptr;
else if(temp_node->left == nullptr)
return temp_node;
return findMin(temp_node->left);
}
Node* MyTree::findMax(Node *temp_node){
if(temp_node == nullptr)
return nullptr;
else if(temp_node->right == nullptr)
return temp_node;
return findMax(temp_node->right);
}
Node* MyTree::remove(int val, Node *temp_node){
Node *current;
if(temp_node == nullptr){
return nullptr;
} else if(val < temp_node->data) {
temp_node->left = remove(val, temp_node->left);
} else if(val > temp_node->data){
temp_node->right = remove(val, temp_node->right);
} else if (temp_node->left && temp_node->right) {
current = findMin(temp_node->right);
temp_node->data = current->data;
temp_node->right = remove(temp_node->data, temp_node->right);
} else {
current = temp_node;
if(temp_node->left == nullptr)
temp_node = temp_node->right;
else if(temp_node->right == nullptr)
temp_node = temp_node->left;
delete current;
}
return temp_node;
}
void MyTree::inorder(Node *temp_node){
if(temp_node == nullptr)
return;
inorder(temp_node->left);
std::cout << temp_node->data << " ";
inorder(temp_node->right);
}
Node* MyTree::find(Node *temp_node, int val){
if(temp_node == nullptr)
return nullptr;
else if(val < temp_node->data)
return find(temp_node->left, val);
else if(val > temp_node->data)
return find(temp_node->right, val);
return temp_node;
}
//main.cpp
#include <iostream>
using namespace std;
int main(){
MyTree *tree = new MyTree;
tree->insert(20);
tree->insert(25);
tree->insert(15);
tree->insert(10);
tree->insert(30);
tree->print();
tree->remove(20);
tree->print();
tree->remove(25);
tree->print();
tree->remove(30);
tree->print();
delete tree;
return 0;
}