由前序中序求后序 数组做法

/*
前序遍历:
    1.访问根节点
    2.前序遍历左子树
    3.前序遍历右子树
中序遍历:
    1.中序遍历左子树
    2.访问根节点
    3.中序遍历右子树
后序遍历:
    1.后序遍历左子树
    2.后序遍历右子树
    3.访问根节点
*/
/*
前序遍历:         GDAFEMHZ
中序遍历:         ADEFGHMZ
后序遍历:    AEFDHZMG
*/
/*
前序遍历的第一个肯定是根结点,第二个肯定是左子树的跟结点;
那么在中序遍历中找到这个数值,之前的肯定是左子树。
再得到左子树的长度p,前序遍历中后移p个长度,就得到有字数的根节点;
满足递归调用。
*/

 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 } 
View Code

 

posted on 2013-08-03 11:35  随风浪子的博客  阅读(264)  评论(0编辑  收藏  举报

导航