不多说直接上代码吧
写的还是挺简单,就是一个递归程序
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct node //二叉树的存储结构
{
char data;
struct node * lch; //左子树
struct node * rch; //右子树
}Tree,*Ptree;
char pre[100];//先序遍历字符数组 【注意是全局变量】
char mid[100]; //中序遍历字符数组
void print(Ptree p);//后序遍历的递归写法
Ptree creat(int pk,int mk,int mj);//创建这棵二叉树
int main ()
{
scanf("%s",pre);
scanf("%s",mid);
int l=strlen(pre);//把串的长度算出来
Ptree p=creat(0,0,l-1);//三个参数分别代表了
//先序串的起始位置,中序串的起始位置,中序串的结束位置
print(p);
printf ("\n");
return 0;
}
Ptree creat(int pk,int mk,int mj)
{
Ptree p=(Ptree) malloc (sizeof(Tree));//动态分配一个树的结点
p->data=pre[pk];//树的相关参数赋值
p->lch=NULL;//左子树先赋值为空
p->rch=NULL;//右子树也先赋值为空
int root;
for (root=mk;root<=mj;root++)//找根节点的索引
if (pre[pk]==mid[root]) break;
int leftlength=root-mk;//左子树的长度
int rightlength=mj-root; //右子树的长度
if (leftlength>0) //if左子树的长度大于0
p->lch=creat(pk+1,mk,root-1);//递归左子树
if (rightlength>0) //if右子树的长度大于0
p->rch=creat(pk+leftlength+1,root+1,mj);//递归右子树
return p;//当左右子树都递归完了就把P值返回
}
void print(Ptree p)//递归输出后序遍历
{
if (p!=NULL)
{
print(p->lch);
print(p->rch);
printf ("%c",p->data);
}
}
/*
样例1:
12473568
47215386
输出:
74258631
*/
/*
样例2:
ABDCEF
BDAECF
输出
DBEFCA
*/
再变一下:已知后序和中序求先序遍历
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
typedef struct node //二叉树的存储结构
{
char data;
struct node * lch; //左子树
struct node * rch; //右子树
}Tree,*Ptree;
char pre[100];//后序遍历字符数组 【注意是全局变量】
char mid[100]; //中序遍历字符数组
void print(Ptree p);//先序遍历的递归写法
Ptree creat(int pk,int mk,int mj);//创建这棵二叉树
int main ()
{
scanf("%s",pre);
scanf("%s",mid);
int l=strlen(pre);//把串的长度算出来
Ptree p=creat(l-1,0,l-1);//三个参数分别代表了
//先序串的起始位置,中序串的起始位置,中序串的结束位置
print(p);
printf ("\n");
return 0;
}
Ptree creat(int pk,int mk,int mj)
{
Ptree p=(Ptree) malloc (sizeof(Tree));//动态分配一个树的结点
p->data=pre[pk];//树的相关参数赋值
p->lch=NULL;//左子树先赋值为空
p->rch=NULL;//右子树也先赋值为空
int root;
for (root=mk;root<=mj;root++)//找根节点的索引
if (pre[pk]==mid[root]) break;
int leftlength=root-mk;//左子树的长度
int rightlength=mj-root; //右子树的长度
if (rightlength>0) //if右子树的长度大于0
p->rch=creat(pk-1,root+1,mj);//递归右子树
if (leftlength>0) //if左子树的长度大于0
p->lch=creat(pk-rightlength-1,mk,root-1);//递归左子树
return p;//当左右子树都递归完了就把P值返回
}
void print(Ptree p)//递归输出先序遍历
{
if (p!=NULL)
{
printf ("%c",p->data);
print(p->lch);
print(p->rch);
}
}
/*
样例1:
74258631
47215386
输出:
12473568
*/
/*
样例2:
DBEFCA
BDAECF
输出
ABDCEF
*/