根据二叉树前序和中序遍历序列,求后续遍历序列。
#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;
}