Advertisement
MeShootIn

бинарное дерево поиска

Nov 3rd, 2017
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.40 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <iostream>
  4. #include <algorithm>
  5. #include <limits.h>
  6. #include <assert.h>
  7. #include <set>
  8. #include <map>
  9. #include <math.h>
  10. #include <queue>
  11. #include <stack>
  12. #include <time.h>
  13. #include <stdlib.h>
  14. using namespace std;
  15. //typedef __int64 i64;
  16. typedef unsigned long long ull;
  17. const int MAXN = 100000;
  18. const int UNDEF = -1; // НЕОПРЕДЕЛЁННОСТЬ
  19. struct tree{ // МАССИВ - ДЕРЕВО
  20.     int parent = UNDEF;
  21.     int left = UNDEF;
  22.     int right = UNDEF;
  23.     int value;
  24.     int cnt = 0; // КОЛ - ВО ЭЛЕМЕНТОВ СО ЗНАЧЕНИЕМ VALUE
  25. };
  26. class binary_tree{
  27.     private :
  28.         tree t[MAXN]; // ДЕРЕВО
  29.         int index = 0; // ПОСЛЕДНИЙ ИНДЕКС
  30.     public :
  31.         //int height = 0; // ВЫСОТА
  32.         int get_index(int x){ // ПОИСК КРАЙНЕГО ИНДЕКСА
  33.             int i = 0;
  34.             while(true){
  35.                 if(x < t[i].value){
  36.                     if(t[i].left == UNDEF){
  37.                         return i;
  38.                     }
  39.                     else{
  40.                         i = t[i].left;
  41.                     }
  42.                 }
  43.                 else{
  44.                     if(t[i].value < x){
  45.                         if(t[i].right == UNDEF){
  46.                             return i;
  47.                         }
  48.                         else{
  49.                             i = t[i].right;
  50.                         }
  51.                     }
  52.                     else{
  53.                         return i;
  54.                     }
  55.                 }
  56.             }
  57.         }
  58.         void ins(int x){
  59.             if(index == 0){ // ПЕРВЫЙ ЭЛЕМЕНТ
  60.                 t[index].value = x;
  61.                 t[index].cnt = 1;
  62.                 index++;
  63.                 return;
  64.             }
  65.             int i = get_index(x);
  66.             if(t[i].value == x){ // ТАКОЙ ЭЛЕМЕНТ УЖЕ ЕСТЬ
  67.                 t[i].cnt++;
  68.             }
  69.             else{
  70.                 t[index].cnt = 1;
  71.                 t[index].parent = i;
  72.                 t[index].value = x;
  73.                 if(x < t[i].value){
  74.                     t[i].left = index;
  75.                 }
  76.                 else{
  77.                     t[i].right = index;
  78.                 }
  79.                 index++;
  80.             }
  81.         }
  82.         void rec(int i){ // ЛЕВЫЙ ОБХОД ИЗ I-ОЙ ВЕРШИНЫ С ВЫВОДОМ ЭЛЕМЕНТОВ В ОТСОРТИРОВАННОМ ПОРЯДКЕ
  83.             if(i == UNDEF){
  84.                 return;
  85.             }
  86.             rec(t[i].left);
  87.             for(int k = 0; k < t[i].cnt; k++){
  88.                 printf("%d ", t[i].value);
  89.             }
  90.             rec(t[i].right);
  91.         }
  92.         int get_left_index(int i){ // САМЫЙ ЛЕВЫЙ ИНДЕКС I-ОЙ ВЕРШИНЫ
  93.             int pos = i;
  94.             while(t[pos].left != UNDEF){
  95.                 pos = t[pos].left;
  96.             }
  97.             return pos;
  98.         }
  99.         int get_right_index(int i){ // САМЫЙ ПРАВЫЙ ИНДЕКС I-ОЙ ВЕРШИНЫ
  100.             int pos = i;
  101.             while(t[pos].right != UNDEF){
  102.                 pos = t[pos].right;
  103.             }
  104.             return pos;
  105.         }
  106. };
  107. int main(){
  108.     int n;
  109.     scanf("%d", &n);
  110.     binary_tree T;
  111.     int x;
  112.     for(int i = 0; i < n; i++){
  113.         scanf("%d", &x);
  114.         T.ins(x);
  115.     }
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement