二叉树重建(前中序遍历求后序模板刘汝佳小白本)

来源:互联网 发布:ci框架打印sql语句 编辑:程序博客网 时间:2024/05/20 08:01

输入一棵二叉树的先序遍历和中序遍历序列,输出它的后序遍历序列。

输入:
DBACEGF ABCDEFG
BCAD CBAD

输出:
ACBFGED
CDAB

#include<stdio.h>#include<string.h>//s1是先序遍历(根左右),s2是中序遍历(左根右),s是后序遍历(左右根) void build(int n,char *s1,char *s2,char *s)//注意这里的s1,s2,s是指针,n表示树中有多少个结点 {    if(n<=0) return;    int p=strchr(s2,s1[0])-s2;//s1[0]表示每个树的根结点,在s2指针所指序列中找到根结点的位置     build(p,s1+1,s2,s);//左子树有p个结点,s1+1表示左子树的根结点,左子树在s2中指针位置不变.s表示左子树的根结点(指针起点)     build(n-p-1,s1+p+1,s2+p+1,s+p);//右子树有n-p-1个结点,指针像右移p+1在前序遍历中找到右子树根结点对应的数值,中序遍历起点+p+1表示在中序遍历后一串序列中找到根结点位置,s+p表示右子树的根结点(指针起点)     s[n-1]=s1[0];//每个树的根结点,左右子树指针起点不同,这句话是单独赋值每个树的根结点 }int main(){    char s1[30],s2[30],s[30];    while(~scanf("%s%s",s1,s2))    {        int n=strlen(s1);        build(n,s1,s2,s);        s[n]='\0';        printf("%s\n",s);    }    return 0;}
原创粉丝点击