中根序列和后根序列重建二叉树
- 描述
-
我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。反过来,如果给定二叉树的中根序列和后根序 列,或者给定中根序列和前根序列,可以重建一二叉树。本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。
用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树
中根序列是9 5 32 67
后根序列9 32 67 5
前根序列5 9 67 32
先读入一个数n代表中序和后序均有n个元素。
接着输入中序序列,在输入后序序列。
输出先序序列。
输入:
4
9 5 32 67
9 32 67 5
输出:
5 9 67 32
#include <stdio.h> #include <string.h>void build(int len, int *s1, int *s2, int *s) {int p;int i;if(len<=0)return;else{for(i=0; i<len; i++){if(s1[i]==s2[len-1]){p = i;}}build(p, s1, s2, s+1);build(len-p-1, s1+p+1, s2+p, s+p+1);s[0] = s2[len-1];} }int main() {int i;int s1[1000], s2[1000], s3[1000];int n;while(scanf("%d", &n)!=EOF){for(i=0; i<n; i++){scanf("%d", &s1[i] );}for(i=0; i<n; i++){scanf("%d", &s2[i] );}build(n, s1, s2, s3 );for(i=0; i<n; i++){printf("%d%c", s3[i], i==n-1?'\n':' ' );}}return 0; }