您的位置:首页 > 其它

HDU 3791 二叉搜索树(用数组保存树)

2016-07-26 09:27 357 查看
判断两序列是否为同一二叉搜索树序列

 

Input

开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。

 

Output

如果序列相同则输出YES,否则输出NO

 

Sample Input

2
567432
543267
576342
0

 

Sample Output

YES
NO

一.总结

用结构来写二叉树真的好麻烦,老是各种错误,用数组就来的简单的多,如果数据范围允许的话,用数组来保存二叉树是很理想的
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int maxn=1024;
int tree1[maxn];
int tree2[maxn];
string a,b;
int find(int n,int p,int *tree)
{
if(tree[p]==-1) return p;
else if(n>tree[p]) return find(n,2*p+1,tree);
else return find(n,2*p,tree);
}
void init1()
{
memset(tree1,-1,sizeof(tree1));
for(int i=0;i<a.length();i++)
{
int p=find(a[i]-48,1,tree1);
tree1[p]=a[i]-48;
}
}
void init2()
{
memset(tree2,-1,sizeof(tree2));
for(int i=0;i<b.length();i++)
{
int p=find(b[i]-48,1,tree2);
tree2[p]=b[i]-48;
}
}
int main()
{
//freopen("/Users/zhangjiatao/Documents/暑期训练/input.txt","r",stdin);
int n;
while(scanf("%d",&n)==1)
{
if(n==0) break;
cin>>a;
init1();
for(int i=1;i<=n;i++)
{
cin>>b;
int flag=1;
init2();
for(int i=1;i<maxn;i++)
{
if(tree1[i]!=tree2[i]) {flag=0;break;}
}
if(flag==1) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: