1020. Tree Traversals (25)
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 7Sample Output:
4 1 6 3 5 7 2
二叉树的还原,直接递归求解。#include<cstdio> #include<string> #include<cstring> #include<vector> #include<iostream> #include<queue> #include<algorithm> using namespace std; typedef long long LL; const int INF = 0x7FFFFFFF; const int maxn = 1e3 + 10; int n, a[maxn], b[maxn], ch[maxn][2], root; void dfs(int&x, int l, int r, int ll, int rr) { if (l > r) x = 0; for (int i = l; i <= r; i++) { if (a[i] == b[rr]) { x = i; dfs(ch[x][0], l, i - 1, ll, ll + i - l - 1); dfs(ch[x][1], i + 1, r, ll + i - l, rr - 1); } } } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); dfs(root, 1, n, 1, n); queue<int> p; p.push(root); while (!p.empty()) { int q = p.front(); p.pop(); if (root != q) printf(" "); printf("%d", a[q]); if (ch[q][0]) p.push(ch[q][0]); if (ch[q][1]) p.push(ch[q][1]); } printf("\n"); return 0; }