树遍历相关算法

本文介绍了一种通过前序和中序遍历序列求解后序遍历序列的方法,并提供了一个C语言实现的示例程序。该程序首先查找中序遍历中的根节点位置,然后递归地处理左右子树,最终输出后序遍历结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树可以通过前序+中序求后序,或者后序+中序求前序。我们无法通过前序和后序求中序,因为后序加前序无法唯一确定一颗二叉树。

例如:

前序:ab

后序:ba

这样你就无法判断b是a的左子树还是右子树。


通过前序和中序求后序,程序如下:

#include <stdio.h>
#include <string.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);                         /**//* 根节点输出。 */
}
int main()
{
	char pre[]="abdc";
	char in[]="bdac";
	printf("The result:");
	pronum(pre,0,strlen(in)-1,in,0,strlen(pre)-1);
	//getch();
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值