给定一棵二叉树的后序遍历和中序遍历,请你输出其层序遍历的序列。这里假设键值都是互不相等的正整数。
输入格式:
输入第一行给出一个正整数N(≤30),是二叉树中结点的个数。第二行给出其后序遍历序列。第三行给出其中序遍历序列。数字间以空格分隔。
输出格式:
在一行中输出该树的层序遍历的序列。数字间以1个空格分隔,行首尾不得有多余空格。
输入样例:
7
2 3 1 5 7 6 4
1 2 3 4 5 6 7
输出样例:
4 1 6 3 5 7 2
#include<cstdio> #include<algorithm> #include<queue> using namespace std; const int maxn = 2e5 + 5; struct Node { int val,l,r; }node[maxn]; int tot = 0; int zhong[maxn],hou[maxn]; int dfs(int len,int zhong[],int hou[]) { if(len <= 0) return -1; if(len == 1) { node[++tot].val = hou[1]; node[tot].l = node[tot].r = -1; // printf("len == 1 %d\n",tot); return tot; } node[++tot].val = hou[len]; // printf("%d %d\n",tot,node[tot].val); int res = tot; int l; for(l = 1;l <= len;l++) if(zhong[l] == hou[len]) break; node[res].l = dfs(l-1,zhong,hou); node[res].r = dfs(len - l,zhong + l,hou + l - 1); return res; } void bfs() { queue<int>que; que.push(1); while(!que.empty()) { int cur = que.front(); que.pop(); if(cur != 1) printf(" "); printf("%d",node[cur].val); if(node[cur].l != -1) que.push(node[cur].l); if(node[cur].r != -1) que.push(node[cur].r); } } int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&hou[i]); for(int i=1;i<=n;i++) scanf("%d",&zhong[i]); dfs(n,zhong,hou); bfs(); return 0; }