算法--根据二叉树前序和中序遍历序列,求后续遍历序列

根据二叉树前序和中序遍历序列,求后续遍历序列。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

//根据字符分割字符串
void SplitSeq1(const char* srcSeq, char splitor, char* &left, char* &right)
{
	int len=strlen(srcSeq);
	int i=0;
	for(i=0; i<len; ++i)
	{
		if(srcSeq[i]==splitor)
			break;
	}
	if(i==len)
	{
		left=right=NULL;
		return;
	}
	left=(char*)malloc(sizeof(char)*(i+1));
	right=(char*)malloc(sizeof(char)*(len-i));

	int pos=i;
	for(i=0; i<pos; i++) 
		left[i]=srcSeq[i];
	left[i]=0;
	for(i=pos+1; i<len; i++) 
		right[i-pos-1]=srcSeq[i];
	right[len-pos-1]=0;
}

//分割字符串2
void SplitSeq2(const char* srcStr, int len1, int len2, char* &left, char* &right)
{
	left=(char*)malloc(sizeof(char)*(len1+1));
	right=(char*)malloc(sizeof(char)*(len2+1));

	int pos=1, i=0;
	for( i=0; i<len1; i++)
		left[i]=srcStr[pos+i];
	left[i]=0;
	pos=pos+i;
	for(i=0; i<len2; i++)
		right[i]=srcStr[pos+i];
	right[i]=0;
}

void PrintPostSeq(const char* preSeq, const char* midSeq)
{
	if(*preSeq==0 || *midSeq==0) return;

	if(*midSeq==*preSeq && strlen(preSeq)==1)
	{
		printf("%c", *preSeq);  return;
	}

	char node=*preSeq;
	char *leftSeqMid=NULL, *rightSeqMid=NULL;
	SplitSeq1(midSeq, node, leftSeqMid, rightSeqMid);

	int len1=strlen(leftSeqMid);   int len2=strlen(rightSeqMid);
	char *leftSeqPre=NULL, *rightSeqPre=NULL;
	SplitSeq2(preSeq, len1, len2, leftSeqPre, rightSeqPre);

	PrintPostSeq(leftSeqPre, leftSeqMid);
	PrintPostSeq(rightSeqPre, rightSeqMid);
	
	free(leftSeqPre); free(leftSeqMid);
	free(rightSeqPre); free(rightSeqMid); 
	printf("%c", node);
}

int main()
{
	char strPre[]="BCAD", strMid[]="CBAD";
	PrintPostSeq(strPre, strMid);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值