PAT甲级练习题A1020. Tree Traversals (25)

    xiaoxiao2025-05-15  11

    题目描述

    Suppose that all the keys in a binary tree are distinct positive integers. Given the postorder and inorder traversal sequences, you are supposed to output the level order traversal sequence of the corresponding binary tree.

    Input Specification:

    Each input file contains one test case. For each case, the first line gives a positive integer N (<=30), the total number of nodes in the binary tree. The second line gives the postorder sequence and the third line gives the inorder sequence. All the numbers in a line are separated by a space.

    Output Specification:

    For each test case, print in one line the level order traversal sequence of the corresponding binary tree. All the numbers in a line must be separated by exactly one space, and there must be no extra space at the end of the line.

    Sample Input: 7 2 3 1 5 7 6 4 1 2 3 4 5 6 7 Sample Output: 4 1 6 3 5 7 2

    题目解析

    本题就是给出二叉树的后序深度遍历和中序深度遍历,要求重建树之后进行宽度遍历。 首先我自己写了一个比较繁琐,可以参考@_Occult_的代码比较简洁。

    代码

    #include<iostream> #include<vector> #include<map> #include<list> using namespace std; struct node { int left = -1, right = -1; }; map<int, node>tree; void get_tree(vector<int> post, vector<int>in) { if (post.size() <= 1) return; int boot = post[post.size() - 1]; int boot_pos = 0; for (; boot_pos < in.size(); ++boot_pos) { if (in[boot_pos] == boot) break; } vector<int>l_post, r_post, l_in, r_in; for (int i = 0; i < in.size(); ++i) { if (i < boot_pos) l_in.push_back(in[i]); if (i > boot_pos) r_in.push_back(in[i]); } for (int i = 0; i < post.size() - 1; ++i) { if (i < l_in.size()) l_post.push_back(post[i]); else r_post.push_back(post[i]); } if (l_post.size() != 0) { tree[boot].left = l_post[l_post.size() - 1]; get_tree(l_post, l_in); } if (r_post.size() != 0) { tree[boot].right = r_post[r_post.size() - 1]; get_tree(r_post, r_in); } return; } int main() { int N, boot; cin >> N; vector<int> post(N, 0), in(N, 0), level; for (int i = 0; i < N; ++i) { cin >> post[i]; } for (int i = 0; i < N; ++i) { cin >> in[i]; } boot = post[post.size() - 1]; get_tree(post, in); list<int>deq(1,boot); while (!deq.empty()) { int front = deq.front(); deq.pop_front(); level.push_back(front); if (tree[front].left != -1) deq.push_back(tree[front].left); if (tree[front].right != -1) deq.push_back(tree[front].right); } cout << level[0]; for (int i = 1; i < level.size(); ++i) cout << " " << level[i]; system("pause"); return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-1298922.html
    最新回复(0)