采用递归算法如下:
每次从先序遍历中找到根节点,然后在中序遍历中根据根节点将串分成左右两部分,依此递归。
#include <stdio.h>
#include <stdlib.h>
int findPos(char inTree[],char c,int in_i,int in_j)
{
int i;
for(i=in_i;i<=in_j;i++)
{
if(inTree[i]==c)
{
return i;
}
}
return 0;
}
void post(char preTree[],int pre_i,int pre_j,char inTree[],int in_i,int in_j)
{
if(in_i==in_j)
{
printf("%c",inTree[in_i]);
return;
}
if(in_i>in_j)
{
return;
}
char c=preTree[pre_i];
int k=findPos(inTree,c,in_i,in_j);
post(preTree,pre_i+1,pre_i+k-in_i,inTree,in_i,k-1);
post(preTree,pre_i+k-in_i+1,pre_j,inTree,k+1,in_j);
printf("%c",c);
}
int main(int argc, char *argv[])
{
char preTree[]="1248059367";
char inTree[]="8042591637";
post(preTree,0,sizeof(preTree)/sizeof(char)-2,inTree,0,sizeof(inTree)/sizeof(char)-2);
return 0;
}