一、思路
后序遍历的最后一个结点就是根节点
可以在中序遍历中找到这个位置p,根结点的左边结点属于左子树,右边结点属于右子树
二、代码
#include<stdio.h>
#include<stdlib.h>
#define MAXN 30
typedef int ElementType;
/*----------树的定义-------------*/
typedef struct TNode *Position;
typedef Position BinTree;
struct TNode {
ElementType Data;//结点数据
BinTree Left;//左子树
BinTree Right;//右子树
};
//根据后序和中序遍历建树
BinTree BuildTree(int Inorder[],int Postorder[],int N);
//输出前序遍历结果
void PreorderTraversal(BinTree BT);
/*----------树的定义结束-------------*/
int main()
{
BinTree T;
int Inorder[MAXN],Postorder[MAXN],N,i;
printf("请输入结点个数:");
scanf("%d",&N);
printf("请输入后序遍历:");
for(i=0;i<N;i++)
scanf("%d",&Postorder[i]);
printf("请输入中序遍历:");
for(i=0;i<N;i++)
scanf("%d",&Inorder[i]);
T=BuildTree(Inorder,Postorder,N);
printf("前序遍历:");
PreorderTraversal(T);
printf("\n");
return 0;
}
BinTree BuildTree(int Inorder[],int Postorder[],int N)
{
BinTree T;
int p;
if(N==0)return NULL;//空树
T=(BinTree)malloc(sizeof(struct TNode));
T->Data =Postorder[N-1];//根节点——后序遍历的最后一个结点
T->Left =T->Right =NULL;
for(p=0;p<N;p++)//在中序遍历中寻找根节点位置
if(Inorder[p]==Postorder[N-1] )break;
//左子树:总个数为P (下标从0开始)
T->Left =BuildTree(Inorder,Postorder,p);
//右子树:中序从Inorder[p+1] ,后序从Postorder[p]开始 ,总个数为N-p-1
T->Right =BuildTree(Inorder+p+1,Postorder+p,N-p-1);
return T;
}
void PreorderTraversal(BinTree T)
{
if(T){
printf("%d ", T->Data);
PreorderTraversal(T->Left);
PreorderTraversal(T->Right);
}
}