Advertisement
Guest User

drzewo bts niekodkonczone usuwanie

a guest
Nov 24th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.02 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // drzewa dla reprezentacji tablicowej
  6. /*const int N = 12;
  7. int drzewo[N] = {12,7,19,3,9,15,-1,-1,-1,-1,-1,14};
  8. int rootT = 0;
  9. void preOrder(int p){
  10.     if(p>=12 || drzewo[p]!=-1) return;
  11.     cout << drzewo[p] << " ";
  12.     preOrder(p*2+1);
  13.     preOrder(p*2+2);
  14. }*/
  15.  
  16. //dla reprezentacji dowiązaniowej
  17. //definicja węzła drzewa
  18. struct wezel{
  19.     int value;
  20.     wezel* left = NULL;
  21.     wezel* right = NULL;
  22.     wezel* up = NULL;
  23. };
  24.  
  25. wezel * root = NULL;
  26.  
  27. void inOrder(wezel* p){
  28.     if(p==NULL) return;
  29.     inOrder(p->left);
  30.     cout << p->value << " ";
  31.     inOrder(p->right);
  32. }
  33.  
  34. void dodaj(int w){
  35.     cout << "dodaj(" << w << "): ";
  36.     wezel* y = new wezel;
  37.     y->value = w;
  38.     if(root==NULL) root = y;
  39.     else{
  40.         wezel* x = root;
  41.         wezel* p = x;
  42.         while(x!=NULL){
  43.             p = x;
  44.             if(w<x->value) x=x->left;
  45.             else x=x->right;
  46.         }
  47.         if(w<p->value) p->left=y;
  48.         else p->right=y;
  49.         y->up = p;
  50.     }
  51.     inOrder(root);
  52.     cout << endl;
  53. }
  54.  
  55. wezel * szukaj(wezel* x, int w){
  56.     if(x==NULL || x->value) return x;
  57.     if(w<x->value) return szukaj(x->left, w);
  58.     else return szukaj(x->right, w);
  59. }
  60.  
  61. wezel * minBST(wezel* x){
  62.     if(x==NULL) return x;
  63.     while(x->left!=NULL) x=x->left;
  64.     return x;
  65. }
  66.  
  67. wezel * maxBST(wezel* x){
  68.     if(x==NULL) return x;
  69.     while(x->right!=NULL) x=x->right;
  70.     return x;
  71. }
  72.  
  73. wezel * nastepnik(wezel* x){
  74.     if(x==NULL) return x;
  75.     if(x->right!=NULL) return minBST(x->right);
  76.     wezel* r = x->up;
  77.     while(r!=NULL && x==r->right){
  78.         x = r;
  79.         r = x->up;
  80.     }
  81.     return x;
  82. }
  83.  
  84. wezel * poprzednik(wezel* x){
  85.     if(x==NULL) return x;
  86.     if(x->left!=NULL) return maxBST(x->left);
  87.     wezel* r = x->up;
  88.     while(r!=NULL && x==r->left){
  89.         x = r;
  90.         r = x->up;
  91.     }
  92.     return x;
  93. }
  94.  
  95. void usun(int w){
  96.     cout << "usun(" << w << "): ";
  97.     wezel* x = szukaj(root, w);
  98.     if(x==NULL) return;
  99.     if(x->left==NULL && x->right==NULL){ //przypadek1:
  100.         delete x;
  101.         return;
  102.     }
  103.     if(x->left==NULL || x->right==NULL){ //przypadek2:
  104.         wezel* syn;
  105.         if(x->left==NULL){
  106.             syn = x->right;
  107.             x->right = NULL;
  108.         }else{
  109.             syn = x->left;
  110.             x->left = NULL;
  111.         }
  112.         x->value = syn->value;
  113.         delete syn;
  114.         return;
  115.     }
  116.     //przypadek3:
  117.     wezel* z = nastepnik(x);
  118.     if(z==NULL) z = poprzednik(x);
  119.     x->value = z->value;
  120.     delete z;
  121.     inOrder(root);
  122.     cout << endl;
  123. }
  124.  
  125. int main(int argc, char* argv){
  126.     //po każdej operacji dodania węzła należy wyświetlić drzewo
  127.     dodaj(10);dodaj(5);dodaj(3);dodaj(9);dodaj(8);dodaj(14);dodaj(12);dodaj(1); dodaj(11);
  128.     szukaj(root, 10); szukaj(root, 1); szukaj(root, 12); szukaj(root, 3); szukaj(root, 14); szukaj(root, 9);
  129.     usun(11); usun(9);usun(5); usun(10);
  130.     cout << "inOrder(root): ";
  131.     inOrder(root);
  132.     cout << endl;
  133.     return 0;
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement