知道先序和中序可以求后序
知道后序和中序可以求中序,
但是必须知道中序才能求其他的
三个遍历的特点:这三种遍历的特点,首先先序序列总是先遍历根节点,所以它的序列的第一个必然是整个二叉树的根节点,相反,后序遍历的序列最后一个必然是二叉树的根节点,通过缺点了二叉树的根节点,在中序序列中找到这个根节点,因为中序序列是先遍历左字数再遍历根节点,然后是右子树,所以在中序序列中的根节点左边的节点全都是左子树的,右边的序列都应该是右子树的,接着递归的应用就可以得到整个二叉树了
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef struct node
{
char data;
struct node *lchild;
struct node *rchild;
}BiNode,*BTree;
void getpre(char *last,char *mid,BTree &T,int len)
{
if(len==0)
{
T=NULL;
return;
}
char ch=last[len-1];
int index=0;
while(mid[index]!=ch)
{
index++;
}
T=(BTree)malloc(sizeof(BiNode));
T->data=mid[index];
getpre(last,mid,T->lchild,index);
getpre(last+index,mid+index+1,T->rchild,len-index-1);
}
//void getpost(char *prim,char *mid,BTree &T,int len)
//{
// if(len==0)
// {
// T=NULL;
// return;
// }
// char ch=prim[0];
// int index=0;
// while(mid[index]!=ch)
// {
// index++;
// }
// T=(BTree)malloc(sizeof(BiNode));
// T->data=mid[index];
// getpost(prim+1,mid,T->lchild,index);
// getpost(prim+1+index,mid+index+1,T->rchild,len-1-index);
//}
void pre(BTree T)
{
if(T!=NULL)
{ printf("%c",T->data);
pre(T->lchild);
pre(T->rchild);
}
}
//void post(BTree T)
//{
// if(T!=NULL)
// {
// post(T->lchild);
// post(T->rchild);
// printf("%c",T->data);
// }
//}
int main()
{
char first[36];
char mid[36];
char last[36];
while(scanf("%s%s",last,mid)!=EOF)
{
BTree T=NULL;
getpre(last,mid,T,strlen(last));
pre(T);
printf("\n");
}
}