二叉树:已知先序中序求后序的算法

TX和小米的笔试题都考到了。。。。。。。。


已知一棵二叉树,其先序序列为:ABDEGMNCFH,中序序列为:DBMGNEACHF,请画出这棵二叉树(给出过程),并给出其后序序列。
首先看先序(根左右),说明A是根,再看中序(左根右),说明A之前的(DBMGNE)都是A的左边,A之后的(CHF)都在A的右边。
在看先序的BDEGMN 同样是根左右,B就是A的左子节点,再看中序的DBMGNE,同样是左根右,D就是B的左孩子(而且左边也只有这一个)。。。。。。。
继续看先序的EGMN,同样是根左右,E就是B的右孩子,
在看中序的MGNE,左根右,说明E只有左边,没有右边,
继续看先序的GMN,根据根左右,G就是的左孩子,
再看中序的MGN,是左根右,说明M是G的左子树,N是G的右字数。。。。。。。。。




#include <stdio.h>
int find(char c,char A[],int s,int e) /* 找出中序中根的位置。 */
{
int i;
for(i=s;i<=e;i++)
       if(A[i]==c) return i;
}
/* 其中pre[]表示先序序,pre_s为先序的起始位置,pre_e为先序的终止位置。 */
/* 其中in[]表示中序,in_s为中序的起始位置,in_e为中序的终止位置。 */
/* pronum()求出pre[pre_s~pre_e]、in[in_s~in_e]构成的后序序列。 */
void pronum(char pre[],int pre_s,int pre_e,char in[],int in_s,int in_e)
{
char c;
int k;
if(in_s>in_e)     return ;                  /* 非法子树,完成。 */
if(in_s==in_e){printf("%c",in[in_s]); /* 子树子仅为一个节点时直接输出并完成。 */
                   return ;
                   }
c=pre[pre_s];                            /* c储存根节点。 */
k=find(c,in,in_s,in_e);                  /* 在中序中找出根节点的位置。 */
pronum(pre,pre_s+1,pre_s+k-in_s,in,in_s,k-1); /* 递归求解分割的左子树。 */
pronum(pre,pre_s+k-in_s+1,pre_e,in,k+1,in_e); /* 递归求解分割的右子树。 */
printf("%c",c);                          /* 根节点输出。 */
}
main()
{
char pre[]="abdc";
char in[]="bdac";
printf("The result:");
pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);
getch();
}


  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值