Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <algorithm>
- #include <iostream>
- void Build(std::vector<int>& tree, int left, int right,
- std::vector<int>& resl, std::vector<int>& resr, std::vector<int>& find_big) {
- if (left >= right) {
- return;
- }
- int elem = tree[left];
- int ind = find_big[left];
- Build(tree, left + 1, ind, resl, resr, find_big);
- resr.push_back(elem);
- Build(tree, ind, right, resl, resr, find_big);
- resl.push_back(elem);
- }
- int main() {
- std::ios_base::sync_with_stdio(false);
- std::cin.tie(nullptr);
- int nn;
- std::cin >> nn;
- std::vector<int> pre_tree(nn);
- for (int i = 0; i < nn; ++i) {
- std::cin >> pre_tree[i];
- }
- std::vector<int> post_tree;
- std::vector<int> in_tree;
- std::vector<int> find(nn);
- for (int ind = 0; ind < nn; ++ind) {
- int left = ind + 1;
- int right = nn;
- while (left < right - 1) {
- int m = (left + right) / 2;
- if (pre_tree[m] < pre_tree[ind]) {
- left = m;
- } else {
- right = m;
- }
- }
- if (pre_tree[left] < pre_tree[ind]) {
- left = right;
- }
- find[ind] = left;
- }
- Build(pre_tree, 0, nn, post_tree, in_tree, find);
- for (auto elem : post_tree) {
- std::cout << elem << ' ';
- }
- std::cout << '\n';
- for (auto elem : in_tree) {
- std::cout << elem << ' ';
- }
- std::cout << '\n';
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement