VasilM

ibd

Nov 25th, 2013
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. // дефинираме тип - указател към структурата node
  5. typedef struct node *po;
  6.  
  7. // създаване на структурата node
  8. struct node {
  9.     int data;
  10.     po left, right;
  11. };
  12.  
  13. // алгоритъм за построяване на
  14. // Идеално Балансирано Дърво (ИБД)
  15. po ibd(int n) {
  16.  
  17.     // условие за дъно на рекурсията
  18.     // броя на оставащите елементи
  19.     // да е по-голям от 0
  20.     if (n>0) {
  21.  
  22.         // разделяне на елементите
  23.         // на две (ляво и дясно поддърво)
  24.         int nLeft = n/2;
  25.         int nRight = n-nLeft-1;
  26.  
  27.         // дефиниране на буферна променлива
  28.         // и променлива, чиято стойност бива
  29.         // въвеждана от потребителя
  30.         po buffer = new node;
  31.         int userInput;
  32.  
  33.         // зареждане на буфера с стойността
  34.         // въведена от потребителя
  35.         cin>>userInput;
  36.         buffer->data=userInput;
  37.  
  38.         // рекурсивно извикване на същатата функция
  39.         // за построяване на поддърветата
  40.         buffer->left = ibd( nLeft );
  41.         buffer->right = ibd( nRight );
  42.  
  43.         // връщане на записаната в буфера стойност, на указателя
  44.         return buffer;
  45.     }
  46.     // ако няма повече елементи,
  47.     // за добавяне, връщаме NULL
  48.     return NULL;
  49. }
  50.  
  51. void print_tab(int n){
  52.     for(int i=0;i<n;i++){
  53.         cout<<"    ";
  54.     }
  55. }
  56. void print_tree(node* n,int tab){
  57.     if(n->right != NULL){
  58.         print_tree(n->right,tab+1);
  59.     }
  60.     print_tab(tab);
  61.     cout<<n->data<<endl;
  62.     if(n->left != NULL){
  63.         print_tree(n->left,tab+1);
  64.     }
  65. }
  66.  
  67. // функция за ИНФИКСНО разпечатване
  68. // ЛЯВО - КОРЕН - ДЯСНО
  69. void infix(node* n) {
  70.     if(n) {
  71.         infix(n->left);
  72.         cout<< n->data << " ";
  73.         infix(n->right);
  74.     }
  75. }
  76.  
  77. // функция за ПРЕФИКСНО разпечатване
  78. // КОРЕН - ЛЯВО - ДЯСНО
  79. void prefix(node* n) {
  80.     if(n) {
  81.         cout<< n->data << " ";
  82.         prefix(n->left);
  83.         prefix(n->right);
  84.     }
  85. }
  86.  
  87. // функция за ПОСТФИКСНО разпечатване
  88. // ЛЯВО - ДЯСНО - КОРЕН
  89. void postfix(node* n) {
  90.     if(n) {
  91.         postfix(n->left);
  92.         postfix(n->right);
  93.         cout<< n->data << " ";
  94.     }
  95. }
  96.  
  97. // Алгоритъм за търсене в ИБД.
  98. // Ако съществува търсеният елемент се извежда позицията,
  99. // на която се намира.
  100. void search(int x, po loc, int& pos) {
  101.  
  102.     // Ако съществуват още елементи в ИБД
  103.     if( loc ) {
  104.  
  105.         pos++; //увеличаваме позицията с 1
  106.        
  107.         // ако това е търсеният елемент
  108.         // прекратяваме изпълнението
  109.         if(loc->data == x) {
  110.             cout << "found at: " << pos << endl;
  111.             return;
  112.         }
  113.  
  114.         // ако все още не сме го намерили
  115.         // търсим в лявото и дясното поддървета
  116.         else {
  117.             search(x, loc->left, pos);
  118.             search(x, loc->right, pos);
  119.         }
  120.     }
  121. }
  122.  
  123. int main () {
  124.  
  125.     // дефиниране и въвеждане на брой
  126.     // възли в идеално балансираното дърво
  127.     int n;
  128.     cin >> n;
  129.  
  130.     // дефиниране и създаване на ИБД
  131.     po root = NULL;
  132.     root = ibd(n);
  133.  
  134.     print_tree(root, 3);
  135.  
  136.     // принтиране на стойностите
  137.     infix(root);
  138.     cout << endl;
  139.     prefix(root);
  140.     cout << endl;
  141.     postfix(root);
  142.     cout << endl;
  143.    
  144.     // търсене в ИБД
  145.     int pos = 0;
  146.     search(3, root, pos);
  147.    
  148.     return EXIT_SUCCESS;
  149.     system("PAUSE");
  150. }
Advertisement
Add Comment
Please, Sign In to add comment