建立二叉树的二叉链表(已知先序和中序,求后序)
#include <stdio.h>
#include <stdlib.h>
#include <string.h> //原理:由前序和中序可以确定唯一的二叉树
typedef struct Node
{
char Data;
struct Node* LChild;
struct Node* RChild; //先序遍历创建
}BiTNode,*PBiTNode;
char pre[200],in[200];
PBiTNode CreatepostBiTree(int pre_start,int pre_end,int in_start,int in_end)
{
int i,LTreeLen,RTreeLen;
PBiTNode T;
T=(PBiTNode)malloc(sizeof(BiTNode)); //建立根节点
T->Data=pre[pre_start]; //遍历前序储存的结点,因为是先序,所以树第一个是数一定是A,
T->LChild=T->RChild=NULL; //置空的方法。
i=in_start;
while(in[i]!=T->Data)
i++;
LTreeLen=i-in_start; //左子树长度 ,这自己画下图就可以知道。
RTreeLen=in_end-i; //右子树长度
if(LTreeLen) //LTreeLen长度为0就结束。
T->LChild=CreatepostBiTree(pre_start+1,pre_start+LTreeLen,in_start,i-1); //啊,这个规律记住就行。
if(RTreeLen)
T->RChild=CreatepostBiTree(pre_start+LTreeLen+1,pre_end,i+1,in_end);
return T; //一个对一个就直接return;
}
PBiTNode temp()
{
PBiTNode T;
int Len_pre,Len_in;
Len_pre=strlen(pre);
Len_in=strlen(in);
T=CreatepostBiTree(0,Len_pre-1,0,Len_in-1);
return T;
}
void print(PBiTNode bt)
{
if(bt!=NULL)
{
print(bt->LChild);
print(bt->RChild);
printf("%c",bt->Data);
}
}
int main()
{
PBiTNode bt;
scanf("%s",pre);
getchar();
scanf("%s",in);
bt=temp();
print(bt);
printf("\n");
return 0;
}