D / / B E / \ / \ A C G / / F
DBACEGF ABCDEFG BCAD CBAD
ACBFGED CDAB
解析:不要看是英文题,其实看懂以后发现根刚写的上一篇博客类似哈,先序+中序-->构建二叉树-->输出后序的题目,直接拿着上一篇博客的代码直接水了过去,还是把代码贴一下哈!
#include <stdio.h>
#include <malloc.h>
#include <string.h>
//二叉链表
typedef struct node{
char data;//节点数据元素
struct node *lchild;//指向左孩子
struct node *rchild;//指向右孩子
}BiNode,*BTree;
//利用后序和中序建立二叉树
void GetPreOrder(char *last,char *mid,BTree &T,int len)
{
if(len==0)
{
T = NULL;
return;
}
//取出后序序列中的最后一个节点
char ch=last[len-1];
int index=0;
//在中序序列中进行查找根节点,并用index记录其在序列中的索引
while(mid[index]!=ch)
{
index++;
}
//给根节点分配空间
T=(BTree)malloc(sizeof(BiNode));
T->data=mid[index];
//建立左子树
GetPreOrder(last,mid,T->lchild,index);
//建立右子树
GetPreOrder(last+index,mid+index+1,T->rchild,len-index-1);
}
void GetPostOrder(char *prim,char *mid,BTree &T,int len)
{
if(len==0)
{
T=NULL;
return;
}
//提出先序序列中的第一个节点
char ch=prim[0];
int index=0;
//在中序序列中查找当前根节点,并用index记录其在序列中的位置
while(mid[index]!=ch)
{
index++;
}
//给根节点分配空间
T=(BTree)malloc(sizeof(BiNode));
T->data=mid[index];
//建立左子树
GetPostOrder(prim+1,mid,T->lchild,index);
//建立右子树
GetPostOrder(prim+index+1,mid+index+1,T->rchild,len-index-1);
}
//先序输出二叉树
void PreOrder(BTree T)
{
if(T!=NULL)
{
printf("%c",T->data);
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//后序输出二叉树
void PostOrder(BTree T)
{
if(T!=NULL)
{
PostOrder(T->lchild);
PostOrder(T->rchild);
printf("%c",T->data);
}
}
int main()
{
char prim[26],mid[26],last[26];
while(scanf("%s%s",prim,mid)!=EOF)
{
BTree T=NULL;
GetPostOrder(prim,mid,T,strlen(prim));
PostOrder(T);
// GetPostOrder(last,mid,T,strlen(last));
// PostOrder(T);
printf("\n");
}
return 0;
}
原文:http://blog.csdn.net/computer_liuyun/article/details/23749945