• Source
    1. #include <iostream>
    2. #include <queue>
    3. using namespace std;
    4.  
    5. typedef struct node{
    6. node *left = nullptr;
    7. node *right = nullptr;
    8. int value;
    9. }node;
    10.  
    11. class tree{
    12. public:
    13. node *root;
    14. tree(int val);
    15.  
    16. void traverse();
    17.  
    18. void level_traverse();
    19.  
    20. void insertNode(int val);
    21.  
    22. void deleteNode(int val);
    23.  
    24. int find_maximum();
    25.  
    26. int find_minimum();
    27.  
    28. private:
    29. void p_preorder_traverse(node *n);
    30.  
    31. void p_inorder_traverse(node *n);
    32.  
    33. void p_postorder_traverse(node *n);
    34.  
    35. void p_insert(node *n, int val);
    36.  
    37. node* p_delete(node *n, int val);
    38.  
    39. node* p_find_maximum(node* ref);
    40.  
    41. node* p_find_minimum(node* ref);
    42.  
    43. node* p_search(node *n, int val);
    44. };
    45.  
    46. void tree::traverse(){
    47. printf("\n");
    48. p_preorder_traverse(this->root);
    49. printf("\n");
    50. p_inorder_traverse(this->root);
    51. printf("\n");
    52. p_postorder_traverse(this->root);
    53. printf("\n");
    54. }
    55.  
    56. void tree::insertNode(int val){
    57. p_insert(this->root, val);
    58. }
    59.  
    60. void tree::deleteNode(int val){
    61. p_delete(this->root, val);
    62. }
    63.  
    64. tree::tree(int val){
    65. node *temp;
    66. temp = (node*)calloc(1,sizeof(node));
    67. temp->left = nullptr;
    68. temp->right = nullptr;
    69. temp->value = val;
    70. this->root = temp;
    71. }
    72.  
    73. int tree::find_maximum(){
    74. node* temp_n = p_find_maximum(this->root);
    75. return temp_n->value;
    76. }
    77.  
    78. int tree::find_minimum(){
    79. node* temp_n = p_find_minimum(this->root);
    80. return temp_n->value;
    81. }
    82.  
    83. void tree::level_traverse(){
    84. queue<node*> q_n;
    85. node* n;
    86. n= this->root;
    87. q_n.push(n);
    88. printf("\n");
    89. while(!q_n.empty()){
    90. printf("%d ", q_n.front()->value);
    91. n = q_n.front();
    92. q_n.pop();
    93. if(n->left!=nullptr){
    94. q_n.push(n->left);
    95. }
    96. if(n->right!=nullptr){
    97. q_n.push(n->right);
    98. };
    99. }
    100. printf("\n");
    101. return;
    102. }
    103.  
    104. void tree::p_preorder_traverse(node *n){
    105. printf("%d ",n->value);
    106. if(n->left!=nullptr){p_preorder_traverse(n->left);}
    107. if(n->right!=nullptr){p_preorder_traverse(n->right);}
    108. };
    109.  
    110. void tree::p_inorder_traverse(node *n){
    111. if(n->left!=nullptr){p_inorder_traverse(n->left);}
    112. printf("%d ",n->value);
    113. if(n->right!=nullptr){p_inorder_traverse(n->right);}
    114. };
    115.  
    116. void tree::p_postorder_traverse(node *n){
    117. if(n->left!=nullptr){p_postorder_traverse(n->left);}
    118. if(n->right!=nullptr){p_postorder_traverse(n->right);}
    119. printf("%d ",n->value);
    120. };
    121.  
    122. void tree::p_insert(node *n, int val){
    123. node *temp;
    124. temp = (node*)calloc(1,sizeof(node));
    125. temp->value = val;
    126. if(n->value == temp->value)
    127. {
    128. printf("canceled. n->value : %d val : %d. \n",n->value,val);
    129. return;
    130. }
    131. else if(n->value > temp->value)
    132. {
    133. if(n->left==nullptr){
    134. n->left = temp;
    135. printf("%d inserted in the left of %d.\n",temp->value,n->value);
    136. return;
    137.  
    138. }
    139. else{p_insert(n->left,val);}
    140.  
    141.  
    142. }
    143. else if(n->value < temp->value)
    144. {
    145. if(n->right==nullptr){
    146. n->right = temp;
    147. printf("%d inserted in the right of %d.\n",val,n->value);
    148. return;
    149. }
    150. else{p_insert(n->right,val);}
    151.  
    152. }
    153. };
    154.  
    155. node* tree::p_search(node *n, int val){
    156.  
    157. if(n==nullptr){
    158. return nullptr;
    159. }
    160. else if(n->value==val){
    161. return n;
    162. }
    163. else if(n->value > val){
    164. return p_search(n->left, val);
    165. }
    166. else if(n->value < val){
    167. return p_search(n->right, val);
    168. }
    169. }
    170.  
    171. node* tree::p_find_maximum(node* ref){
    172. if(ref->right==nullptr){
    173. return ref;
    174. }
    175. else{
    176. return p_find_maximum(ref->right);
    177. }
    178. }
    179.  
    180. node* tree::p_find_minimum(node* ref){
    181. if(ref->left==nullptr){
    182. return ref;
    183. }
    184. else{
    185. return p_find_maximum(ref->left);
    186. }
    187. }
    188.  
    189. node* tree::p_delete(node *n, int val){
    190. if(n->value > val){
    191. n->left = p_delete(n->left,val);
    192. }
    193. else if(n->value < val){
    194. n->right = p_delete(n->right,val);
    195. }
    196. else{
    197. if(n->left==nullptr){
    198. node* temp_n = n->right;
    199. free(n);
    200. return temp_n;
    201. }
    202. else if(n->right==nullptr){
    203. node* temp_n = n->left;
    204. free(n);
    205. return temp_n;
    206. }
    207.  
    208. node* min_n = p_find_minimum(n->right);
    209. n->value = min_n->value;
    210. n->right = p_delete(min_n->right,min_n->value);
    211.  
    212. }
    213. return n;
    214. }
    215.  
    216.  
    217.  
    218. int main() {
    219. tree* abc = new tree(6);
    220. abc->insertNode(4);
    221. abc->insertNode(9);
    222. abc->insertNode(2);
    223. abc->insertNode(8);
    224. abc->insertNode(11);
    225. abc->insertNode(10);
    226. abc->insertNode(13);
    227. abc->insertNode(5);
    228. printf("DFS result : ");
    229. abc->traverse();
    230. printf("BFS result : ");
    231. abc->level_traverse();
    232. printf("the maximum value of the tree is %d.\n",abc->find_maximum());
    233. printf("the minimum value of the tree is %d.\n",abc->find_minimum());
    234. return 0;
    235. }