Advertisement
artemgf

Деревья

Feb 24th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.17 KB | None | 0 0
  1. #include <iostream>
  2. #include <conio.h>
  3. #include <math.h>
  4. #include <string>
  5. #include <algorithm>
  6. #include <set>
  7.  
  8. using namespace std;
  9.  
  10. struct node
  11. {
  12.     int data;
  13.     node* left;
  14.     node* right;
  15. };
  16.  
  17. node* newnode(int data)
  18. {
  19.     node* newnode = new node;
  20.  
  21.     newnode->data = data;
  22.     newnode->left = NULL;
  23.     newnode->right = NULL;
  24.     return(newnode);
  25. }
  26.  
  27. void addright(node* node, int data)
  28. {
  29.     node->right = newnode(data);
  30. }
  31.  
  32. void addleft(node* node, int data)
  33. {
  34.     node->left = newnode(data);
  35. }
  36.  
  37. int j = 1;
  38. void addtreesme(node* node, int i, int data[])
  39. {
  40.     if (j <= i)
  41.         if (node->left == NULL)
  42.         {
  43.             addleft(node, data[j]);
  44.             j++;
  45.         }
  46.     if (j <= i)
  47.         if (node->right == NULL)
  48.         {
  49.             addright(node, data[j]);
  50.             j++;
  51.         }
  52.     if (j <= i)
  53.         addtreesme(node->left, j, data);
  54.  
  55. }
  56.  
  57. void addtreesset(node* node, int data)
  58. {
  59.     if (node->data < data)
  60.         if (node->right != NULL)
  61.             addtreesset(node->right, data);
  62.         else
  63.             addright(node, data);
  64.     else
  65.         if (node->data > data)
  66.             if (node->left != NULL)
  67.                 addtreesset(node->left, data);
  68.             else
  69.                 addleft(node, data);
  70. }
  71.  
  72. void print(node* node)
  73. {
  74.     cout << node->data << ' ';
  75.  
  76.     if (node->left != NULL)
  77.     {
  78.         cout << endl;
  79.         print(node->left);
  80.     }
  81.     if (node->right != NULL)
  82.         print(node->right);
  83. }
  84.  
  85. node* findleft(node* root)
  86. {
  87.     if (root != NULL)
  88.     {
  89.         if (root->left != NULL)
  90.             findleft(root->left);
  91.         else
  92.             return root;
  93.     }
  94.     else
  95.         return root;
  96. }
  97.  
  98. node* findperent(node* child, int v)
  99. {
  100.     node* root = new node;
  101.  
  102.     root = child;
  103.     if (v > root->data)
  104.         if (root->right != NULL)
  105.             if (root->right->data == v)
  106.                 return root;
  107.             else
  108.                 return findperent(root->right, v);
  109.         else
  110.             return NULL;
  111.     else
  112.         if (root->left != NULL)
  113.             if (root->left->data == v)
  114.                 return root;
  115.             else
  116.                 return findperent(root->left, v);
  117.         else
  118.             if (root-> data == v)
  119.                 return root;
  120.             else
  121.                 return NULL;
  122. }
  123.  
  124. node* deletenode(node* root, int v)
  125. {
  126.     node* perent = new node;
  127.     node* child = new node;
  128.     node* prom = new node;
  129.     node* prom2 = new node;
  130.     int i = 0;
  131.  
  132.     if (root->data != v)
  133.     {
  134.         perent = findperent(root, v);
  135.         if (perent == NULL)
  136.         {
  137.             return root;
  138.         }
  139.         else
  140.  
  141.             if (perent->left != NULL&&perent->left->data == v)
  142.                 if (perent->left->left == NULL&&perent->left->right != NULL)
  143.                 {
  144.                     child = perent->left;
  145.                     perent->left = child->right;
  146.                 }
  147.                 else
  148.                     if (perent->left->left != NULL&&perent->left->right == NULL)
  149.                     {
  150.                         child = perent->left;
  151.                         perent->left = child->left;
  152.                     }
  153.                     else
  154.                         if (perent->left->left == NULL&&perent->left->right == NULL)
  155.                         {
  156.                             child = perent->left;
  157.                             perent->left = NULL;
  158.                         }
  159.                         else
  160.                         {
  161.                             child = perent->left;
  162.                             prom = findleft(child->right);
  163.                             prom2 = findperent(root, prom->data);
  164.                             if (prom2->left != NULL&&prom2->left->data == prom->data)
  165.                                 prom2->left = NULL;
  166.                             else
  167.                                 prom2->right = NULL;
  168.                             perent->left = prom;
  169.                             prom->left = child->left;
  170.                             prom->right = child->right;
  171.                         }
  172.             else
  173.                 if (perent->right != NULL&&perent->right->data == v)
  174.                     if (perent->right->left == NULL&&perent->right->right != NULL)
  175.                     {
  176.                         child = perent->right;
  177.                         perent->right = child->right;
  178.                     }
  179.                     else
  180.                         if (perent->right->left != NULL&&perent->right->right == NULL)
  181.                         {
  182.                             child = perent->right;
  183.                             perent->right = child->left;
  184.                         }
  185.                         else
  186.                             if (perent->right->left == NULL&&perent->right->right == NULL)
  187.                             {
  188.                                 child = perent->right;
  189.                                 perent->right = NULL;
  190.                             }
  191.                             else
  192.                             {
  193.                                 child = perent->right;
  194.                                 prom = findleft(child->right);
  195.                                 prom2 = findperent(root, prom->data);
  196.                                 if (prom2->left != NULL&&prom2->left->data == prom->data)
  197.                                     prom2->left = NULL;
  198.                                 else
  199.                                     prom2->right = NULL;
  200.                                 perent->right = prom;
  201.                                 prom->left = child->left;
  202.                                 prom->right = child->right;
  203.                             }
  204.                 else
  205.                     return root;
  206.  
  207.     }
  208.     else
  209.     {
  210.         if (root->left == NULL&& root->right != NULL)
  211.             root = root->right;
  212.         else
  213.             if (root->left != NULL&& root->right == NULL)
  214.                 root = root->right;
  215.             else
  216.                 if (root->left != NULL&& root->right != NULL)
  217.                 {
  218.                     child = root;
  219.                     prom = findleft(child->right);
  220.                     prom2 = findperent(root, prom->data);
  221.                     if (prom2->left != NULL&&prom2->left->data == prom->data)
  222.                         prom2->left = NULL;
  223.                     else
  224.                         prom2->right = NULL;
  225.                     prom->left = child->left;
  226.                     prom->right = child->right;
  227.                     root = prom;
  228.                 }
  229.                 else
  230.                 {
  231.                     delete root;
  232.                     i++;
  233.                 }
  234.     }
  235.     delete child;
  236.  
  237.     if (i == 0)
  238.         return root;
  239.     else
  240.         return NULL;
  241. }
  242.  
  243. node* find(node* root, int data)
  244. {
  245.     if (root->data = data)
  246.         return root;
  247.     if (root == NULL)
  248.         return NULL;
  249.     if (root->data < data)
  250.         return find(root->left, data);
  251.     else
  252.         return find(root->right, data);
  253. }
  254.  
  255. using namespace ::std;
  256.  
  257. int main()
  258. {
  259.  
  260.     int data[4] = { 0,9,6,11 };
  261.     node* t = new node;
  262.  
  263.     t = newnode(0);
  264.  
  265.     addtreesset(t, data[1]);
  266.     addtreesset(t, data[2]);
  267.     addtreesset(t, data[3]);
  268.     addtreesset(t, -2);
  269.  
  270.     t=deletenode(t, 0);
  271.     print(t);
  272.  
  273.     _getch();
  274.     return 0;
  275. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement