题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3791
题目大意:给出若干行数列,其中第一行的数列为基本二叉搜索树的模式,剩下的数列都为需要比较的数列,若构造出的二叉搜索树与基本数列相同,则输出“YES”,否则输出“NO”;
解题思路:根据题目给出的数列构造二叉搜索树,然后循环遍历树,判断是否相等。因为题目较简单,实用数组进行简单的模拟,根据左子节点是根节点下标的2倍,而右子节点是根节点下标的2倍加1.
AC代码:
#include <iostream>
#include <cstring>
using namespace std;
void inserttree(int *tr,int value)
{
int index=1;
while(tr[index]!=-1)
{
if(tr[index]<value)
index = index*2+1;
else index = index*2;
}
tr[index] = value;
}
void buildtree(int *tree,char *in,int len)
{
for(int i=0;i<len;i++)
{
inserttree(tree,in[i]-'0');
}
}
bool compare(int *a,int *b,int len)
{
bool f = true;
for(int i=0;i<len;i++)
{
if(a[i]!=b[i])f = false;
}
return f;
}
int main()
{
int source[1000];
int pattern[1000];
int n;
while(cin>>n)
{
memset(source,-1,sizeof(source));
if(n==0)break;
for(int i=0;i<=n;i++)
{
char putin[1000];
cin>>putin;
int len = strlen(putin);
if(i==0)buildtree(source,putin,len);
else
{
memset(pattern,-1,sizeof(pattern));
buildtree(pattern,putin,len);
bool flag = compare(source,pattern,512);
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
}
}
return 0;
}