Advertisement
Guest User

Untitled

a guest
Nov 18th, 2017
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.49 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. #include <iostream>
  4.  
  5. void Build(std::vector<int>& tree, int left, int right,
  6. std::vector<int>& resl, std::vector<int>& resr, std::vector<int>& find_big) {
  7.     if (left >= right) {
  8.         return;
  9.     }
  10.     int elem = tree[left];
  11.     int ind = find_big[left];
  12.     Build(tree, left + 1, ind, resl, resr, find_big);
  13.     resr.push_back(elem);
  14.     Build(tree, ind, right, resl, resr, find_big);
  15.     resl.push_back(elem);
  16. }
  17.  
  18. int main() {
  19.     std::ios_base::sync_with_stdio(false);
  20.     std::cin.tie(nullptr);
  21.     int nn;
  22.     std::cin >> nn;
  23.     std::vector<int> pre_tree(nn);
  24.     for (int i = 0; i < nn; ++i) {
  25.         std::cin >> pre_tree[i];
  26.     }
  27.     std::vector<int> post_tree;
  28.     std::vector<int> in_tree;
  29.     std::vector<int> find(nn);
  30.     for (int ind = 0; ind < nn; ++ind) {
  31.         int left = ind + 1;
  32.         int right = nn;
  33.         while (left < right - 1) {
  34.             int m = (left + right) / 2;
  35.             if (pre_tree[m] < pre_tree[ind]) {
  36.                 left = m;
  37.             } else {
  38.                 right = m;
  39.             }
  40.         }
  41.         if (pre_tree[left] < pre_tree[ind]) {
  42.             left = right;
  43.         }
  44.         find[ind] = left;
  45.     }
  46.     Build(pre_tree, 0, nn, post_tree, in_tree, find);
  47.     for (auto elem : post_tree) {
  48.         std::cout << elem << ' ';
  49.     }
  50.     std::cout << '\n';
  51.     for (auto elem : in_tree) {
  52.         std::cout << elem << ' ';
  53.     }
  54.     std::cout << '\n';
  55.     return 0;
  56. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement