fork download
  1. //MyTree.h
  2. #include <iostream>
  3. struct Node{
  4. int data;
  5. Node *left;
  6. Node *right;
  7. };
  8. class MyTree{
  9. public:
  10. MyTree(); // constructor
  11. ~MyTree(); // destructor
  12. void insert(int);
  13. void remove(int);
  14. void print();
  15. void search(int);
  16. private:
  17. Node* root;
  18. Node* makeEmpty(Node*);
  19. Node* insert(int, Node*);
  20. Node* findMin(Node*);
  21. Node* findMax(Node*);
  22. Node* remove(int, Node *);
  23. void inorder(Node*);
  24. Node* find(Node*, int val);
  25. };
  26. MyTree::MyTree(){
  27. root = nullptr;
  28. }
  29. MyTree::~MyTree(){
  30. root = makeEmpty(root);
  31. }
  32. void MyTree::insert(int val){
  33. root = insert(val, root);
  34. }
  35. void MyTree::remove(int val){
  36. root = remove(val, root);
  37. }
  38. void MyTree::print(){
  39. inorder(root);
  40. std::cout << "\n";
  41. }
  42. void MyTree::search(int val){
  43. root = find(root, val);
  44. }
  45. Node* MyTree::makeEmpty(Node *temp_node){
  46. if(temp_node == nullptr)
  47. return nullptr;
  48. makeEmpty(temp_node->left);
  49. makeEmpty(temp_node->right);
  50. delete temp_node;
  51. return nullptr;}
  52. Node* MyTree::insert(int val, Node *temp_node){
  53. if(temp_node == nullptr){
  54. temp_node = new Node;
  55. temp_node->data = val;
  56. temp_node->left = temp_node->right = nullptr;
  57. } else if(val < temp_node->data){
  58. temp_node->left = insert(val, temp_node->left);
  59. } else if(val > temp_node->data){
  60. temp_node->right = insert(val, temp_node->right);
  61. }
  62. return temp_node;
  63. }
  64. Node* MyTree::findMin(Node *temp_node){
  65. if(temp_node == nullptr)
  66. return nullptr;
  67. else if(temp_node->left == nullptr)
  68. return temp_node;
  69. return findMin(temp_node->left);
  70. }
  71. Node* MyTree::findMax(Node *temp_node){
  72. if(temp_node == nullptr)
  73. return nullptr;
  74. else if(temp_node->right == nullptr)
  75. return temp_node;
  76. return findMax(temp_node->right);
  77. }
  78. Node* MyTree::remove(int val, Node *temp_node){
  79. Node *current;
  80. if(temp_node == nullptr){
  81. return nullptr;
  82. } else if(val < temp_node->data) {
  83. temp_node->left = remove(val, temp_node->left);
  84. } else if(val > temp_node->data){
  85. temp_node->right = remove(val, temp_node->right);
  86. } else if (temp_node->left && temp_node->right) {
  87. current = findMin(temp_node->right);
  88. temp_node->data = current->data;
  89. temp_node->right = remove(temp_node->data, temp_node->right);
  90. } else {
  91. current = temp_node;
  92. if(temp_node->left == nullptr)
  93. temp_node = temp_node->right;
  94. else if(temp_node->right == nullptr)
  95. temp_node = temp_node->left;
  96. delete current;
  97. }
  98. return temp_node;
  99. }
  100. void MyTree::inorder(Node *temp_node){
  101. if(temp_node == nullptr)
  102. return;
  103. inorder(temp_node->left);
  104. std::cout << temp_node->data << " ";
  105. inorder(temp_node->right);
  106. }
  107. Node* MyTree::find(Node *temp_node, int val){
  108. if(temp_node == nullptr)
  109. return nullptr;
  110. else if(val < temp_node->data)
  111. return find(temp_node->left, val);
  112. else if(val > temp_node->data)
  113. return find(temp_node->right, val);
  114. return temp_node;
  115. }
  116. //main.cpp
  117. #include <iostream>
  118. using namespace std;
  119. int main(){
  120. MyTree *tree = new MyTree;
  121. tree->insert(20);
  122. tree->insert(25);
  123. tree->insert(15);
  124. tree->insert(10);
  125. tree->insert(30);
  126. tree->print();
  127. tree->remove(20);
  128. tree->print();
  129. tree->remove(25);
  130. tree->print();
  131. tree->remove(30);
  132. tree->print();
  133. delete tree;
  134. return 0;
  135. }
Success #stdin #stdout 0s 5304KB
stdin
 
stdout
10 15 20 25 30 
10 15 25 30 
10 15 30 
10 15