基礎到不能再基礎的。。數據結構題?(霧)
pre_order的字符串找到樹根,然後在in_order中找到樹根,將樹劃分爲左右子樹。。遞歸求解即可。
AC代碼如下。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int left[26];
int right[26];
char pre_order[26];
char in_order[26];
int build(int pre_start,int pre_end,int in_start,int in_end)
{
int root=pre_order[pre_start]-'A';
if(pre_end-pre_start==1) return pre_order[pre_start]-'A';
if(pre_end<=pre_start) return -1;
int mid=find(&in_order[in_start],&in_order[in_end],pre_order[pre_start])-in_order;
int pos=pre_start;
for(int i=in_start;i<mid;i++)
pos=max(pos,(int)(find(&pre_order[pre_start],&pre_order[pre_end],in_order[i])-pre_order));
left[root]=build(pre_start+1,pos+1,in_start,mid);
right[root]=build(pos+1,pre_end,mid+1,in_end);
return root;
}
void print(int root)
{
if(root==-1)
return;
else
{
print(left[root]);
print(right[root]);
printf("%c", root+'A');
}
}
int main()
{
while(scanf("%s",pre_order)!=EOF)
{
memset(right,-1,sizeof(right));
memset(left,-1,sizeof(left));
scanf("%s", in_order);
int l=strlen(in_order);
int root=build(0,l,0,l);
print(root);
printf("\n");
}
return 0;
}