先给你一个数字n,接着是一串数字,你把它顺序扫描后建立一棵二叉搜索树。然后再陆续给你n串数字,判断它们尽力的二叉树和第一个二叉树是否相同。
题目保证给出的字符串长度不大于10.每个数字在0~9之间。且给出的数字不会有重复。
很明显,这是一个数据结构的题目,很容易想到的就是直接自定义个二叉树结点的结构来做了。但是我感觉那样好麻烦,题目已经给出了数字长度不会大于10.所以直接用静态的链表也就是数组来解就可以了。要是数字的个数太多就不能这样做了。来看二叉树中结点与数组下标的对应关系。
注意!上图中结点中的数字并不代表结点的值,而是代表与保存结点值的数组的下标之间的对应关系。
#include <iostream>
using namespace std;
#include <cstring>
#define MAX 512
int node[MAX];
int node2[MAX];
void makeTree(char *str,int *node)
{
for(int i=0;str[i]!=‘\0‘;i++)
{
int j=0;
int t=str[i]-‘0‘;
while(node[j]!=-1)
{
if(t>node[j])
j=(j+1)*2;
if(t<node[j])
j=(j+1)*2-1;
}
node[j]=t;
}
}
void compare()
{
for(int i=0;i<MAX;i++)
if(node[i]!=node2[i])
{
cout<<"NO"<<endl;
return;
}
cout<<"YES"<<endl;
}
int main()
{
int n;
char str[12],str2[12];
cin>>n;
if(!n)
return 0;
memset(node,-1,sizeof(node));
cin>>str;
makeTree(str,node);
int len=strlen(str);
while(n--)
{
memset(node2,-1,sizeof(node2));
cin>>str2;
int len2=strlen(str2);
if(len!=len2)
{
cout<<"NO"<<endl;
continue;
}
makeTree(str2,node2);
compare();
}
main();
return 0;
}
这里因为n有多个,一般的main函数章写法就是while(cin>>n){ }了,但是我不想套这么大的一个花括号,于是就写了个递归调用main()。哈哈O(∩_∩)O~
hdu3791静态链表解二叉搜索树,布布扣,bubuko.com
原文地址:http://blog.csdn.net/guodongxiaren/article/details/26244819