#include<stdio.h>
#include<string.h>
#define N 100
struct Node{
struct Node *lchild;
struct Node *rchild;
char c;
}Tree[N];
int loc=0;
Node *create(){//静态分配一个结点
Tree[loc].lchild=Tree[loc].rchild=NULL;
return &Tree[loc++];
}
char str1[N],str2[N];
Node *build(int s1,int e1,int s2,int e2){//分别代表两个字符串的起始下标和结束下标
Node *T=create();
T->c=str1[s1];
int i;//记录串二中终止下标
char temp=str1[s1];
for(i=s2;i<=e2;i++){
if(str2[i]==temp)break;
}
if(i==e2){//如果该结点右边不再有树
char temp1=str1[s1+1];
for(i=s2;i<e2;i++){
if(temp1==str2[i])break;//*************向前探寻一个结点
}
if(i>s2&&i<e2-1){//如果在左右都有树
T->lchild=build(s1+1,s1+i-s2+1,s2,i);
T->rchild=build(s1+i-s2+2,e1,i+1,e2-1);
}
if(i==e2-1)T->lchild=build(s1+1,e1,s2,e2-1);//如果只有右边有树
if(i==s2)T->rchild=build(s1+1,e1,s2,e2-1);//如果只有左边有树
}
return T;
}
FILE *fp1,*fp2;
void inOrder(Node *T){//中序遍历
if(T->lchild)inOrder(T->lchild);
fprintf(fp2,"%c",T->c);
if(T->rchild)inOrder(T->rchild);
}
int main(){
fp1=fopen("4.in","r");
fp2=fopen("4.out","w");
fscanf(fp1,"%s",str1);
fscanf(fp1,"%s",str2);
int len1=strlen(str1);
int len2=strlen(str2);
Node *T=build(0,len1-1,0,len2-1);
inOrder(T);
return 0;
}
USTC机试——根据先序和后序建立中序遍历的一种可能序列
最新推荐文章于 2019-02-17 22:43:50 发布