二叉树遍历问题

已知某二叉树的前序遍历是DBACFEG,中序遍历为ABCDEFG。问该二叉树的后序遍历。求哪位高手(高抬贵手)破解一下,拜谢!

/**
**由前序,和中序创建二叉树,
**由已知的二叉树,得到他的后序
**/
#include<stdio.h>
#define TElemType char
#define MaxSize 10
typedef enum{Link,Thread}PointerThr;
typedef struct BitThrNode{
TElemType Data;
struct BitThrNode *lchild,*rchild;
PointerThr LTag,RTag;
}BiThrNode;
typedef struct Stack{
BiThrNode *Data;
struct Stack *next;
}Stack;
void InputTree(char *P,char *M); /*输入二叉树*/
void Correspinding(char*,char*,unsigned*); /*求得对应位置*/
void inputlater(BiThrNode*);
main()
{
unsigned PtoM[MaxSize],*Point,*first,i,k,j=0,L=0;
BiThrNode *node,*top,*p,*temp;
BiThrNode* Addr[MaxSize];
/**
char Pre[MaxSize]= "ATBZXCYP";
char Midd[MaxSize] = "TZBACYXP";
**/
char Pre[MaxSize];
char Midd[MaxSize];
memset(PtoM, 0x00,MaxSize*sizeof(unsigned));
InputTree(Pre,Midd);
Correspinding(Pre,Midd,PtoM);

Point = (unsigned*)malloc(MaxSize*sizeof(unsigned));
memset(Point, 0x00,MaxSize*sizeof(unsigned));
node = (BiThrNode*)malloc(sizeof(BiThrNode));
memset(node, 0x00,sizeof(BiThrNode));
node->Data = Pre[0];
top=p= node;
first = Point;
*Point = PtoM[0];
Point++;

printf("%s\n",Pre);
printf("%s\n",Midd);
printf("\n得到对应序列:");
for(i=0;i<10;i++){
printf("%d,",PtoM[i]);
}
printf("\n\n");
/**由前序,和中序创建二叉树**/
printf("\n创建二叉树(过程):\n");
for(i=1;*(Pre+i);i++)
{
printf("\n第%d次-----(%d %d p=%c)------\n",i,PtoM[i],*(Point-1),p->Data);

if(PtoM[i] == *(Point-1))
{
Point--;
p = Addr[i];
continue;
}
node = (BiThrNode*)malloc(sizeof(BiThrNode));
memset(node, 0x00,sizeof(BiThrNode));
node->Data = Pre[i];
temp = node;
if(PtoM[i]<PtoM[i-1])
{p->lchild = node;
printf("%c ",p->lchild->Data);
for(j=i+1;j<=MaxSize;j++)
{ if(PtoM[j]==*(Point-1))break;/*注意*/
if(PtoM[j]>PtoM[i-1])
{
node = (BiThrNode*)malloc(sizeof(BiThrNode));
memset(node, 0x00,sizeof(BiThrNode));
node->Data = Pre[j];
p->rchild = node;
printf("%c(j=%d %d,%d) ",p->rchild->Data,j,PtoM[j],*(Point-1));
Addr[j] = node;
*Point = PtoM[j];/*注意*/
Point++;
break;
}
}
}else{
p->rchild = node;

printf("%c ",p->rchild->Data);
}
p = temp;
}

printf("\n---------------------\n");
inputlater(top);
getch();
return 0;
}
/***由已知的二叉树,得到他的后序***/
void inputlater(BiThrNode *head)
{int i;
Stack *ST,*S,*pre,*p,*top,*temp;
/*首先建立了两个栈
**(后续排序是左右根,我反放为 根右左) p存放最终的结果
** s暂时存放左值
*/
ST = (Stack*)malloc(sizeof(Stack));
ST->Data = head;/*放的是BiThrNode类型的指针*/
ST->next = NULL;
p = ST;
S = (Stack*)malloc(sizeof(Stack));
S->Data = NULL;
S->next = NULL;
top = pre = S;
do{

if(p->Data->rchild && p->Data->lchild)
{
ST = (Stack*)malloc(sizeof(Stack));
ST->Data = p->Data->rchild;
ST->next = p;

S = (Stack*)malloc(sizeof(Stack));
S->Data = p->Data->lchild;
S->next = pre;
pre = S;
p = ST;
}
if(p->Data->rchild && !p->Data->lchild)
{
ST = (Stack*)malloc(sizeof(Stack));
ST->Data = p->Data->rchild;
ST->next = p;
p = ST;
}
if(!p->Data->rchild && p->Data->lchild)
{
ST = (Stack*)malloc(sizeof(Stack));
ST->Data = p->Data->lchild;
ST->next = p;
p = ST;
}

if((!p->Data->lchild) && (!p->Data->rchild))
{if(pre==top)break;
temp = pre->next;
pre->next = p;
p = pre;
pre =temp;
}
}while(1);
printf("\n由已知的二叉树,得到他的后序:\n\n");
do{
printf("%c ",p->Data->Data);
p=p->next;
}while(p);
}
void Correspinding(char *P,char *M,unsigned *C)
{ int i,j;
for(i=0;*(P+i);i++){
for(j=0;*(M+j);j++)
{
if(M[j]==P[i])C[i]=j;
}
}
}
void InputTree(char *P,char *M)
{
int i;
char c;
printf("请输入前序序列:");
for(i=0;(c=getchar())!='\n';i++)
{
if(c!=',')P[i] = c;
else i--;
}
P[i] = '\0';
printf("请输入中序序列:");
for(i=0;(c=getchar())!='\n';i++)
{
if(c!=',')M[i] = c;
else i--;
}
M[i] = '\0';
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-03-13
唉,这种题做了好多道了。经常碰到不给分的人,一点动力都没有了。
再为LZ做一次吧
*******D
***B******F
*A***C**E***G
后序遍历应该是ACBEGFD

参考资料:严蔚敏清华大学出版社《数据结构》第二版

第2个回答  2009-03-18
前序的第一个字母D为根节点,中序遍历中以D左右分开 ABC D EFG,ABC为D的左子树,EFG为D的右子树,再按照此方法,前序遍历D之后BAC FEG,可知左子树中B为根节点,右子树中F为根节点,以此类推

后序遍历应该是ACBEGFD
第3个回答  2009-03-12
ACBEGFD
第4个回答  2009-03-12
后序遍历事指左子树右子树跟 你可以画个图
第5个回答  2009-03-13
太简单了
ACBEGFD