由前序中序求后序 数组做法
/*
前序遍历:
1.访问根节点
2.前序遍历左子树
3.前序遍历右子树
中序遍历:
1.中序遍历左子树
2.访问根节点
3.中序遍历右子树
后序遍历:
1.后序遍历左子树
2.后序遍历右子树
3.访问根节点
*/
/*
前序遍历: GDAFEMHZ
中序遍历: ADEFGHMZ
后序遍历: AEFDHZMG
*/
/*
前序遍历的第一个肯定是根结点,第二个肯定是左子树的跟结点;
那么在中序遍历中找到这个数值,之前的肯定是左子树。
再得到左子树的长度p,前序遍历中后移p个长度,就得到有字数的根节点;
满足递归调用。
*/
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 # include <stdio.h> 2 # include <stdlib.h> 3 # include <string.h> 4 void build(int n, char *s1, char *s2, char *s) 5 { //n指当前操作的二叉树的长度; 6 if(n<=0) return; 7 int p = strchr(s2, s1[0]) - s2; 8 //p是指s1[0]在s2中的偏移量,从开始往后; 9 build(p, s1+1, s2, s); 10 //操作左子树;p指左子树的长度,s1+1表示在s1所指的字符串中(长度为p)右移一个位置 11 //因为根的数据已经被访问; 12 build(n-p-1, s1+p+1, s2+p+1, s+p); 13 //操作右子树;n-p-1指右子树的长度,s1+p+1同上, 14 s[n-1] = s1[0]; //每次操作把根节点赋给s。 15 } 16 17 int main(){ 18 char s1[200], s2[200], s[200]; 19 scanf("%s %s", s1, s2); //输入前序和后序; 20 int len = strlen(s1); //计算长度; 21 build(len, s1, s2, s); 22 s[len] = '\0'; 23 printf("%s", s); 24 return 0; 25 }