Advertisement
Guest User

Untitled

a guest
Sep 18th, 2019
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.61 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4. class Bi_node
  5. {
  6.     private:
  7.     int val;
  8.     Bi_node* left;
  9.     Bi_node* right;
  10.     public:
  11.     Bi_node(int value = 1){
  12.         val = value;
  13.         left = NULL;
  14.         right = NULL;
  15.     }
  16.     ~Bi_node(){
  17.        
  18.     }
  19.    
  20.     Bi_node& add(int a){
  21.         Bi_node* current = this;
  22.         Bi_node* current1 = current;
  23.         Bi_node* x = new Bi_node(a);
  24.         while (current){
  25.             if (current->val == a){
  26.                 cout<<"Already suschestvuet"<<endl;
  27.                 return *this;
  28.             }
  29.             current1 = current;
  30.             if (x->val < current1->val){
  31.                 current = current-> left;
  32.             }
  33.             else {
  34.                 current=current-> right;
  35.             }
  36.         }
  37.         if (x->val < current1->val){
  38.             current1->left = x;
  39.         }
  40.         else{
  41.             current1->right = x;
  42.         }
  43.         return *this;
  44.     }
  45.     int search(int a){
  46.         Bi_node* current = this;
  47.         Bi_node* current1 = current;
  48.         while (current){
  49.             current1 = current;
  50.             if (current1->val==a){
  51.                 cout<<1;
  52.                 return 1;
  53.             }
  54.             if (a < current1->val){
  55.                
  56.                 current = current-> left;
  57.             }
  58.             else {
  59.                
  60.                 current=current-> right;
  61.             }
  62.         }
  63.         if (current1->val==a){
  64.                 cout << 1;
  65.                 return 1;
  66.             }
  67.         else{
  68.             cout << 0;
  69.             return 0;
  70.         }
  71.     }
  72.     Bi_node* search_for_del(int a){
  73.         Bi_node* current = this;
  74.         Bi_node* current1 = current;
  75.         while (current){
  76.             current1 = current;
  77.             if (current1->val==a){
  78.                 return current1;
  79.             }
  80.             if (a < current1->val){
  81.                 current = current-> left;
  82.             }
  83.             else {
  84.                
  85.                 current=current-> right;
  86.             }
  87.         }
  88.         if (current1->val==a){
  89.                 return current1;
  90.             }
  91.         else {
  92.             return NULL;
  93.         }
  94.     }
  95.     Bi_node* min(){
  96.         Bi_node* current = this;
  97.         Bi_node* current1 = current;
  98.         while(current->left){
  99.             current1 = current;
  100.             current = current->left;
  101.         }
  102.         return current1;
  103.     }
  104.     Bi_node* max(){
  105.         Bi_node* current = this;
  106.         Bi_node* current1 = current;
  107.         while(current->right){
  108.             current1 = current;
  109.             current = current->right;
  110.         }
  111.         return current1;
  112.     }
  113.     Bi_node* search_for_del1(int a){
  114.         Bi_node* current = this;
  115.         Bi_node* current1 = NULL;
  116.         while (current){
  117.             current1=current;
  118.             if (current->val == a){
  119.                 return current1;
  120.             }
  121.             if (a < current->val){
  122.                 if (current->left->val == a){
  123.                     return current1;
  124.                 }
  125.                 current = current-> left;
  126.             }
  127.             else {
  128.                 if (current->right->val == a){
  129.                     return current1;
  130.                 }
  131.                 current=current-> right;
  132.             }
  133.         }
  134.        
  135.     }
  136.    
  137.     Bi_node& del(int a){
  138.         Bi_node* el = search_for_del(a);
  139.         if (el == NULL){
  140.             cout<<"No element"<<endl;
  141.         }
  142.         if (el->left==NULL && el->right==NULL){
  143.             Bi_node* prev_el = search_for_del1(a);
  144.             if (prev_el->val > a){
  145.                 delete prev_el->left;
  146.                 prev_el->left = NULL;
  147.                 return *this;
  148.             }
  149.             if (prev_el->val < a){
  150.                 delete prev_el->right;
  151.                 prev_el->right = NULL;
  152.                 return *this;
  153.             }
  154.         }
  155.         if (el->left==NULL && el->right!=NULL){
  156.             Bi_node* mini = el->right->min();
  157.             int b = mini -> val;
  158.             if (mini->left!=NULL){
  159.                 b = mini->left->val;
  160.             }
  161.             el->val = b;
  162.             if (mini->left == NULL){
  163.                 el->right = mini->right;
  164.                 delete mini;
  165.             }
  166.             else{
  167.                 delete mini->left;
  168.                 mini->left = NULL;
  169.             }
  170.             return *this;
  171.         }
  172.         if (el->left!=NULL && el->right==NULL){
  173.             Bi_node* maxi = el->left->max();
  174.             int c = maxi -> val;
  175.             if (maxi->right!=NULL){
  176.             c = maxi ->right-> val;
  177.             }
  178.             el->val = c;
  179.             if (maxi->right == NULL){
  180.                 el->left = maxi->left;
  181.                 delete maxi;
  182.             }
  183.             else{
  184.                 delete maxi->right;
  185.                 maxi->right = NULL;
  186.             }
  187.             return *this;
  188.         }
  189.         else {
  190.             Bi_node* maxi = el->left->max();
  191.             Bi_node* mini = el->right->min();
  192.             int b = mini -> val;
  193.             int c = maxi -> val;
  194.             if (maxi->right!=NULL){
  195.                 c = maxi ->right-> val;
  196.             }
  197.             if (mini->left!=NULL){
  198.                 b = mini->left->val;
  199.             }
  200.             if ((c - a) < (a - b)){
  201.                 el->val = c;
  202.                 if (maxi->right == NULL){
  203.                     el->left = maxi->left;
  204.                     delete maxi;
  205.                 }
  206.                 else{
  207.                     delete maxi->right;
  208.                     maxi->right = NULL;
  209.                 }
  210.             }
  211.             else{
  212.                 el->val = b;
  213.                 if (mini->left == NULL){
  214.                     el->right = mini->right;
  215.                     delete mini;
  216.                 }
  217.                 else{
  218.                     delete mini->left;
  219.                     mini->left = NULL;
  220.                 }
  221.             }
  222.             return *this;
  223.         }
  224.     return *this;
  225.     }
  226.     void print(){
  227.         if (left == NULL){
  228.             if (right == NULL){
  229.                 cout<<this->val<<" ";
  230.                 return;
  231.             }
  232.             cout<<this->val<<" ";
  233.             right->print();
  234.             return;
  235.         }
  236.         left->print();
  237.         if (right == NULL){
  238.             if (left == NULL){
  239.                 cout<<this->val<<" ";
  240.                 return;
  241.             }
  242.             cout<<this->val<<" ";
  243.             return;
  244.         }
  245.         cout<<this->val<<" ";
  246.         right->print();
  247.     }
  248.     void del_all(){
  249.         if (left){
  250.             left->del_all();
  251.             delete left;
  252.         }
  253.         if (right){
  254.         right->del_all();
  255.         delete right;
  256.         }
  257.     }
  258. };
  259. class Bi_tree
  260. {
  261.   private:
  262.     Bi_node* root;
  263.   public:
  264.     Bi_tree(int a = 20){
  265.       root = new Bi_node(a);
  266.     }
  267.     ~Bi_tree(){
  268.       root->del_all();
  269.     }
  270.     Bi_tree& add1(int a){
  271.       root->add(a);
  272.       return *this;
  273.     }
  274.     int search1(int a){
  275.       int b = root->search(a);
  276.       return b;
  277.     }
  278.     Bi_tree& del1(int a){
  279.       root->del(a);
  280.       return *this;
  281.     }
  282.     void print_tree(){
  283.       root->print();
  284.     }
  285. };
  286. int main()
  287. {
  288.     Bi_node root = Bi_node(15);
  289.     root.add(5);
  290.     root.add(8);
  291.     root.add(10);
  292.     root.add(11);
  293.     root.add(9);
  294.     root.add(4);
  295.     root.add(3);
  296.     root.add(1);
  297.     root.add(2);
  298.     root.add(6);
  299.     root.add(14);
  300.     root.print();
  301.     cout<<endl;
  302.     root.del(4);
  303.     root.del(10);
  304.     root.del(8);
  305.     root.print();
  306.     cout<<endl;
  307.     root.add(17);
  308.     root.add(25);
  309.     root.add(21);
  310.     root.print();
  311.     cout<<endl;
  312.     root.del_all();
  313.     return 0;
  314. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement