您的位置:首页 > 其它

hdu-3791-二叉搜索树

2014-08-21 21:34 288 查看

二叉搜索树

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)

Total Submission(s): 2848    Accepted Submission(s): 1245


[align=left]Problem Description[/align]
判断两序列是否为同一二叉搜索树序列

[align=left]Input[/align]
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。

接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。

接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

[align=left]Output[/align]
如果序列相同则输出YES,否则输出NO

[align=left]Sample Input[/align]

2
567432
543267
576342
0

[align=left]Sample Output[/align]

YES
NO 二叉树写不好,只能用二维数组过了
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int a[11][3],b[11][3];
char c[11],d[11];
void hebing1(char x,char y)
{
int k;
if(x>y)
{
k=x-'0';
if(a[k][0]==-1) a[k][0]=y-'0';
else
hebing1(a[k][0]+'0',y);
}
else if(x<y)
{
k=x-'0';
if(a[k][1]==-1) a[k][1]=y-'0';
else
hebing1(a[k][1]+'0',y);
}
return;
}

void hebing2(char x,char y)
{
int k;
if(x>y)
{
k=x-'0';
if(b[k][0]==-1) b[k][0]=y-'0';
else
hebing2(b[k][0]+'0',y);
}
else if(x<y)
{
k=x-'0';
if(b[k][1]==-1) b[k][1]=y-'0';
else
hebing2(b[k][1]+'0',y);
}
return;
}

int main()
{
int n,i,j,k;
while(scanf("%d",&n)&&n)
{
scanf("%s",c);
for(i=0;i<11;i++)
a[i][0]=a[i][1]=a[i][2]=-1;
a[c[0]-'0'][2]=1;
for(i=1;c[i]!='\0';i++)
{
hebing1(c[0],c[i]);
a[c[i]-'0'][2]=1;
}
for(i=0;i<n;i++)
{
scanf("%s",d);
//memset(b,-1,sizeof(b));
for(j=0;j<11;j++)
b[j][0]=b[j][1]=b[j][2]=-1;
b[d[0]-'0'][2]=1;
for(j=1;d[j]!='\0';j++)
{
hebing2(d[0],d[j]);
b[d[j]-'0'][2]=1;
}
for(k=j=0;j<10;j++)
if(a[j][0]!=b[j][0]||a[j][1]!=b[j][1]||a[j][2]!=b[j][2])
{
k=1;
break;
}
if(k) printf("NO\n");
else printf("YES\n");
//for(j=0;j<10;j++)
//printf("%d %d %d %d   %d %d %d\n",j,a[j][0],a[j][1],a[j][2],b[j][0],b[j][1],b[j][2]);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: