题目链接: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;
}