概述
描述:
给定一个先序(后序)和中序来建立一个二叉树,例如先序序列:ABDCEF,后序序列:BDAECF
建立一个二叉树
递归
先序遍历的第一个节点是根节点。在中序遍历的序列中,位于该节点左边的是左子树,位于该节点右边的是右子树。
如果左子树不为空,那么前序遍历的第二个节点就是左子树的根节点,否则就是右子树的根节点。对左右子树再分别重复上述步骤,可唯一确定一个二叉树。
(后序序列就要从后往前)
代码
#include <stdio.h>
struct TNode{
char data;
struct TNode* left;
struct TNode* right;
};
TNode* piTree(char *pa, char *ia, int p1, int p2, int i1, int i2)
{
int ia_mid;
TNode *T;
T=new TNode;
T->data=pa[p1];
T->left=T->right=NULL;
if(p1>p2 || i1>i2)
return NULL;
for(ia_mid=0;;ia_mid++){
if(pa[p1]==ia[ia_mid])
break;
}//在中序序列找根节点
T->left = piTree(pa,ia,p1+1,p1+(ia_mid-i1),i1,ia_mid-1);
T->right = piTree(pa,ia,p1+(ia_mid-i1)+1,p2,ia_mid+1,i2);
return T;
}
void PostTravel(TNode* T)
{ //后序序列打印
if(T==NULL) return;
if(T->left) PostTravel(T->left);
if(T->right) PostTravel(T->right);
printf("%c", T->data);
}
int main()
{
char pre[100], in[100];
int n; //用来保存序列长度
TNode *T; //用来保存二叉树的根
printf("输入先序序列:\n");
scanf("%s", pre);
printf("输入中序序列:\n");
scanf("%s", in);
n=0;
while(pre[n]) n++; //计算序列长度
T= piTree(pre, in, 0, n-1, 0, n-1);
printf("后序序列:\n");
PostTravel(T); //打印后序序列
return 0;
}
运行结果示例: