您的位置:首页 > 理论基础 > 计算机网络

http://acm.hdu.edu.cn/showproblem.php?pid=3791&&二叉搜索树

2012-07-09 18:31 447 查看
[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解题思路:二叉搜索树,又称为二叉排序树,其性质:通过对二叉排序树的中序遍历,即得到从小到大排列。在建树的过程中进行比较,一旦不相等就结束。AC代码:
#include<iostream>
#include<string.h>
#include<string>
#include<memory.h>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define N  2<<11//注意易错点
using namespace std;
char s
;
char _s
;
char s1
;
int flag;
void Build(char ch,int pos,int ans)
{
if(_s[pos]==-1)
{
_s[pos]=ch;
if(ans)
if(ch!=s[pos]) flag=false;
return;
}
if(ch>_s[pos]) Build(ch,pos<<1 | 1,ans);
else           Build(ch,pos<<1,ans);
}
void solve(bool ans)
{
flag=true;
for(int i=0;i<strlen(s1);++i)
{
if(!flag) return;
Build(s1[i],1,ans);
}
}
int main()
{
int n;
while(~scanf("%d",&n),n)
{
CLR(_s,-1);
scanf("%s",s1);
int len=strlen(s1);
solve(0);
memcpy(s,_s,strlen(_s));//
for(int i=0;i!=n;++i)
{
CLR(_s,-1);
scanf("%s",s1);
int res=strlen(s1);
if(res!=len)
{
puts("NO");
continue;
}
solve(1);
if(flag) puts("YES");
else     puts("NO");
}
}return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  build input output