Advertisement
icatalin

Laborator-4-Arbori-binari-de-cautare.txt

Jan 5th, 2019
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. struct Node
  6. {
  7.     Node* st;
  8.     Node* dr;
  9.     int info;
  10. };
  11.  
  12. class Tree
  13. {
  14. public:
  15.     Node* root;
  16.     void add(int value); //done
  17.     Node* del(Node*, int value); //done
  18.     void RSD(Node*); //done
  19.     void SRD(Node*); //done
  20.     void SDR(Node*); //done
  21.     Node* findMaxim(Node* ); //done
  22.     bool find(int value);//done
  23.     int height(Node* ); //done
  24.     int* sortedArray();
  25. };
  26.  
  27. void Tree::add(int value)
  28. {
  29.     Node* newNode = new Node;
  30.     newNode->st = NULL;
  31.     newNode->dr = NULL;
  32.     newNode->info = value;
  33.  
  34.     if(root == NULL)
  35.     {
  36.         root = newNode;
  37.         return;
  38.     }
  39.  
  40.     Node* temp = root;
  41.     while(1)
  42.     {
  43.         if(value > temp->info && temp->dr == NULL)
  44.         {
  45.             temp->dr = newNode;
  46.             break;
  47.         }
  48.         if(value < temp->info && temp->st == NULL)
  49.         {
  50.             temp->st = newNode;
  51.             break;
  52.         }
  53.         if(value > temp->info)
  54.             temp = temp->dr;
  55.         else if(value < temp->info)
  56.             temp = temp->st;
  57.     }
  58. }
  59.  
  60. bool Tree::find(int value)
  61. {
  62.     Node* temp = root;
  63.     if(temp == NULL)
  64.         return false;
  65.     else if (temp->info == value)
  66.         return true;
  67.  
  68.     while(temp != NULL && temp->info != value)
  69.     {
  70.         if(temp->info > value)
  71.         {
  72.             if(temp->st != NULL)
  73.                 temp = temp->st;
  74.             else return false;
  75.         }
  76.         else if(temp->info < value)
  77.         {
  78.             if(temp->dr != NULL)
  79.                 temp = temp->dr;
  80.             else return false;
  81.         }
  82.     }
  83.     return (temp->info == value);
  84. }
  85.  
  86. int Tree::height(Node* current)
  87. {
  88.     if(current == NULL)
  89.         return 0;
  90.  
  91.     int leftHeight = height(current->st);
  92.     int rightHeight = height(current->dr);
  93.  
  94.     return (max(leftHeight, rightHeight) +1);
  95. }
  96.  
  97. Node* Tree::findMaxim(Node* root)
  98. {
  99.     Node* temp = root;
  100.     if(temp == NULL)
  101.         return NULL;
  102.     while(temp->dr != NULL)
  103.         temp = temp->dr;
  104.     return temp;
  105. }
  106.  
  107. Node* Tree::del(Node* current, int value)
  108. {
  109.     if(current == NULL)
  110.         return NULL;
  111.     else if(value < current->info)      //daca valoarea este mai mica decat valoarea nodului curent,
  112.         current->st = del(current->st, value);      //cautam in subarborele stang
  113.     else if(value > current->info)      //daca e mai mare,
  114.         current->dr = del(current->dr, value);      //cautam in subarborele drept
  115.     else                                //daca valorile sunt egale (am ajuns la nodul cautat)
  116.     {
  117.         ///leaf node
  118.         if(current->dr == NULL && current->st == NULL)
  119.         {
  120.             delete current;
  121.             current = NULL ;
  122.         }
  123.         ///one child
  124.         else if(current->dr == NULL)
  125.         {
  126.             Node* temp = current;
  127.             current = current->st;
  128.             delete temp;
  129.         }
  130.         else if(current->st == NULL)
  131.         {
  132.             Node* temp = current;
  133.             current = current->dr;
  134.             delete temp;
  135.         }
  136.         ///two children
  137.         else
  138.         {
  139.             Node* temp = findMaxim(current->st);        //cautam maximul in subarborele stang
  140.             current->info = temp->info;     //interschimbam current cu maximul
  141.             del(current->st, temp->info);       //aplicam stergerea pentru current
  142.         }
  143.     }
  144.     return current;
  145. }
  146.  
  147. void Tree::SRD(Node* current)
  148. {
  149.     if(current == NULL)
  150.         return;
  151.     SRD(current->st);
  152.     cout<<current->info<<" ";
  153.     SRD(current->dr);
  154. }
  155.  
  156. void Tree::RSD(Node* current)
  157. {
  158.     if(current == NULL)
  159.         return;
  160.     cout<<current->info<<" ";
  161.     RSD(current->st);
  162.     RSD(current->dr);
  163. }
  164.  
  165. void Tree::SDR(Node* current)
  166. {
  167.     if(current == NULL)
  168.         return;
  169.     SDR(current->st);
  170.     SDR(current->dr);
  171.     cout<<current->info<<" ";
  172. }
  173.  
  174.  
  175. int main()
  176. {
  177.     Tree ob;
  178.     ob.root = NULL;
  179.     ob.add(1);
  180.     ob.add(4);
  181.     ob.add(2);
  182.     ob.add(0);
  183.     ob.add(5);
  184.     ob.SRD(ob.root);
  185.     cout<<endl<<ob.find(4);
  186.     cout<<"\nHeight is "<<ob.height(ob.root)<<'\n';
  187.     ob.del(ob.root, 0);
  188.     ob.SRD(ob.root);
  189.     return 0;
  190. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement