Advertisement
majczel23000

[AiSD] 7. BST

Nov 29th, 2017
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.13 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct wezel{
  5.     wezel *left;
  6.     wezel *right;
  7.     wezel *parent;
  8.     int key;
  9. };
  10.  
  11. void preorder(wezel *root)
  12. {
  13.     if(root)
  14.     {
  15.         cout<<root->key<< " ";
  16.         preorder(root->left);
  17.         preorder(root->right);
  18.     }
  19. }
  20.  
  21. void inorder(wezel *root)
  22. {
  23.     if(root)
  24.     {
  25.         inorder(root->left);
  26.         cout<<root->key<< " ";
  27.         inorder(root->right);
  28.     }
  29. }
  30.  
  31. void postorder(wezel *root)
  32. {
  33.     if(root)
  34.     {
  35.         postorder(root->left);
  36.         postorder(root->right);
  37.         cout<<root->key<< " ";
  38.     }
  39. }
  40.  
  41. void dodaj(wezel *&root, int key)
  42. {
  43.     wezel *p;
  44.     p = new wezel;
  45.     p->key = key;
  46.     if(root == NULL)
  47.     {
  48.         root = p;
  49.         root->left = 0;
  50.         root->right = 0;
  51.         root->parent = 0;
  52.     }
  53.     else
  54.     {
  55.         wezel *x, *q;
  56.         x = root;
  57.         q = 0;
  58.         while(x != 0)
  59.         {
  60.             q = x;
  61.             if(p->key < x->key)
  62.                 x = x->left;
  63.             else
  64.                 x = x->right;
  65.         }
  66.         if(p->key < q->key)
  67.         {
  68.             q->left = p;
  69.             p->parent = q;
  70.         }
  71.         else
  72.         {
  73.             q->right = p;
  74.             p->parent = q;
  75.         }
  76.         p->left = 0;
  77.         p->right = 0;
  78.     }
  79. }
  80.  
  81. wezel *maximum(wezel * root)
  82. {
  83.     if(root == NULL)
  84.         return NULL;
  85.     while(root->right)
  86.         root = root->right;
  87.     return root;
  88. }
  89.  
  90. wezel *minimum(wezel * root)
  91. {
  92.     if(root == NULL)
  93.         return NULL;
  94.     while(root->left)
  95.         root = root->left;
  96.     return root;
  97. }
  98.  
  99. wezel *nastepnik(wezel * root)
  100. {
  101.     wezel * r;
  102.     if(root)
  103.     {
  104.         if(root->right)
  105.             return minimum(root->right);
  106.         else
  107.         {
  108.             r = root->parent;
  109.             while(r && (root == r->right))
  110.             {
  111.                 root = r;
  112.                 root = root->parent;
  113.             }
  114.             return r;
  115.         }
  116.     }
  117.     return root;
  118. }
  119.  
  120. wezel *poprzednik(wezel * root)
  121. {
  122.     wezel * r;
  123.     if(root)
  124.     {
  125.         if( root->left)
  126.             return maximum(root->left);
  127.         else
  128.         {
  129.             r = root->parent;
  130.             while(r && (root == r->left))
  131.             {
  132.                 root = r;
  133.                 r = r->parent;
  134.             }
  135.             return r;
  136.         }
  137.     }
  138.     return root;
  139. }
  140.  
  141. void searchBST(wezel *root, int key)
  142. {
  143.     if(root == NULL)
  144.         cout<<"[SZUKAJ] Wartosc: "<<key<< " nie wystepuje w BST"<<endl;
  145.     else if(root && root->key == key)
  146.     {
  147.         cout<<"[SZUKAJ] Wartosc: "<<key<< " wystepuje w BST"<<endl;
  148.     }
  149.     else
  150.     {
  151.         if(key < root->key)
  152.             searchBST(root->left, key);
  153.         else
  154.             searchBST(root->right, key);
  155.     }
  156. }
  157.  
  158. wezel *szukaj(wezel *root, int key)
  159. {
  160.     while(root && root->key != key)
  161.     {
  162.         if(key < root->key)
  163.             root = root->left;
  164.         else
  165.             root = root->right;
  166.     }
  167.     return root;
  168. }
  169.  
  170. void removeWezel(wezel *& root, wezel *X)
  171. {
  172.     wezel *Y, *Z;
  173.     if(X)
  174.     {
  175.         // Jeśli X nie ma synów lub ma tylko jednego, to Y wskazuje X
  176.         // Inaczej Y wskazuje następnik X
  177.         Y = !X->left || !X->right ? X : nastepnik(X);
  178.         // Z wskazuje syna Y lub NULL
  179.         Z = Y->left ? Y->left : Y->right;
  180.         // Jeśli syn Y istnieje, to zastąpi Y w drzewie
  181.         if(Z)
  182.             Z->parent = Y->parent;
  183.         // Y zostaje zastąpione przez Z w drzewie
  184.         if(!Y->parent)
  185.             root = Z;
  186.         else if(Y == Y->parent->left)
  187.             Y->parent->left  = Z;
  188.         else
  189.             Y->parent->right = Z;
  190.         // Jeśli Y jest następnikiem X, to kopiujemy dane
  191.         if(Y != X)
  192.             X->key = Y->key;
  193.         delete Y;
  194.     }
  195. }
  196.  
  197. bool deleteWezel(wezel *& root, int key)
  198. {
  199.     wezel *p, *q;
  200.     p = root;
  201.     q = 0;
  202.     while(p!=0 && key != p->key){
  203.         q = p;
  204.         if(key > p->key)
  205.             p = p->right;
  206.         else
  207.             p = p->left;
  208.     }
  209.     //p wskazuje element do usuniecia, q - poprzedni element
  210.     if( p == 0 )    //jesli BST jest puste
  211.         return false;
  212.     if( p->left == 0 || p->right == 0 ) //jesli NIE ma przynajmniej jednego potomka
  213.     {
  214.         if( p->left == 0 )  //jesli nie ma lewego
  215.         {
  216.             if( q == 0 )    //jak usuwamy korzen
  217.                 root = p->right;    //nowy korzen
  218.             else{
  219.                 if( key > q->key )  //jestesmy w prawym poddrzewie
  220.                     q->right = p->right;
  221.                 else                //jestesmy w lewym poddrzewie
  222.                     q->left = p->right;
  223.             }
  224.         }
  225.         else    //jesli jest lewy
  226.         {
  227.             if( q == 0 )    //jak usuwamy korzen
  228.                 root = p->left;
  229.             else{
  230.                 if( key > q->key)   //jestesmy w prawym poddrzewie
  231.                     q->right = p->left;
  232.                 else                //jestesmy w lewym poddrzewie
  233.                     q->left = p->left;
  234.             }
  235.         }
  236.     }
  237.     else    //jesli ma obu potomkow
  238.     {
  239.         wezel *naj, *pnaj;
  240.         naj = p->left;
  241.         pnaj = p;
  242.         while( naj->right != 0 ){
  243.             pnaj = naj;
  244.             naj = naj->right;
  245.         }
  246.         if( pnaj->left == 0 )
  247.             pnaj->right = naj->left;
  248.         else
  249.             pnaj->left = naj->left;
  250.         if( p->left != naj ){
  251.             naj->left = p->left;
  252.             naj->right = p->right;
  253.         }
  254.         if( q == 0 )
  255.             root = naj;
  256.         else{
  257.             if( key > q->key )
  258.                 q->right = naj;
  259.             else
  260.                 q->left= naj;
  261.         }
  262.         delete p;
  263.     }
  264.   return true;
  265. }
  266.  
  267.  
  268.  
  269.  
  270. int main(){
  271.  
  272.     wezel *root = 0;
  273.     dodaj(root,5);
  274.     dodaj(root,7);
  275.     dodaj(root,3);
  276.     dodaj(root,10);
  277.     dodaj(root,8);
  278.     dodaj(root,13);
  279.     dodaj(root,1);
  280.     dodaj(root,4);
  281.  
  282.     inorder(root);
  283.  
  284.     cout<<endl;
  285.     cout<<maximum(root)->key<<endl;
  286.     cout<<minimum(root)->key<<endl;
  287.     removeWezel(root, szukaj(root,3));
  288.     deleteWezel(root, 5);
  289.  
  290.     inorder(root);
  291.     return 0;
  292. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement