VasilM

ddp & search

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