给定先序:ABCDEFGHIJK
给定中序:CBEDGFAHJIK
首先分析上述给定的先,中序,首先得知先序遍历的肯定是二叉树的根节点:A,在看中序遍历,根据中序遍历的原理可知,在A左边的一定全部属于A的左子树,在其右边的肯定属于其右子树。再看序列,先序:BCDEFG,中序:CBEDGF,可以把这两个序列作为遍历一个树的结果,那么同理可知B肯定是此树的根节点,二C属于此树的左子树部分,EDGF属于此树的右子树部分。根据这些应用递归,则可以建立一个二叉树。写递归函数最重要的就是寻找递归结束的条件,在写完程序会标定.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
}BiTNode;
void MakeTree(char in_order[],int in_start,int in_end,char pre_order[],int pre_start,int pre_end,BiTNode **T)
{
int i;
if(in_start>in_end||pre_start>pre_end) //此为结束条件,需要理解的朋友需要自己根据给的先序和中序自己画图,然后推敲算法。
*T=NULL;
for(i=in_start;i<=in_end;i++)
{
if(in_order[i]==pre_order[pre_start])
{
*T=(BiTNode*)malloc(sizeof(BiTNode));
(*T)->data=in_order[i];
MakeTree(in_order,in_start,i-1,pre_order,pre_start+1,pre_start+i-in_start,&(*T)->lchild);
MakeTree(in_order,i+1,in_end,pre_order,pre_start+i-in_start+1,pre_end,&(*T)->rchild);
break;
}
if(i>in_end)
{
printf("error,input wrong data!\n");
return;
}
}
}
void postorder(BiTNode *T)
{
if(T)
{
postorder(T->lchild);
postorder(T->rchild);
printf("%c\t",T->data);
}
}
void main()
{
BiTNode *T=NULL;
char in[MAX_SIZE],pre[MAX_SIZE];
printf("请输入前序序列:\n");
gets(pre);
printf("请输入中序序列:\n");
gets(in);
MakeTree(in,0,strlen(in)-1,pre,0,strlen(pre)-1,&T);
printf("\n后序遍历序列为:\n");
postorder(T);
printf("\n");
}