二叉树算法:中序、后序推导先序(数组递归实现 【*模板】)
中根序列和后根序列重建二叉树
- 描述
-
我们知道如何按照三种深度优先次序来周游一棵二叉树,来得到中根序列、前根序列和后根序列。反过来,如果给定二叉树的中根序列和后根序 列,或者给定中根序列和前根序列,可以重建一二叉树。本题输入一棵二叉树的中根序列和后根序列,要求在内存中重建二叉树,最后输出这棵二叉树的前根序列。
用不同的整数来唯一标识二叉树的每一个结点,下面的二叉树
中根序列是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; }