HDU - 3791:二叉搜索树
来源:
标签:
参考资料:
相似题目:
题目
判断两序列是否为同一二叉搜索树序列。
输入
开始一个数n,(1<=n<=20)表示有n个需要判断,n= 0的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出
如果序列相同则输出YES,否则输出NO。
输入样例
2
567432
543267
576342
0
输出样例
YES
NO
解题思路
如果两棵树的中序遍历结果一样且后序遍历(或前序遍历)结果也一样,则这两棵树是相同的。
参考代码
#include<stdio.h>
#include<string.h>
void read(int *a,int &ind)
{
char s[10];
scanf("%s",s);
int len=strlen(s);
for(int i=0;i<len;i++)
{
a[ind++]=s[i]-'0';
}
}
struct Node{
int v;
Node *left;
Node *right;
Node(){
v=0;
left=NULL;
right=NULL;
}
};
Node* build(int *a,int len)
{
Node *root=new Node();
root->v=a[0];
for(int i=1;i<len;i++)
{
Node *u=root;
for(;;)
{
if(a[i]<(u->v))
{
if(u->left==NULL)
{
u->left=new Node();
u=u->left;
u->v=a[i];
break;
}
else u=u->left;
}
else
{
if(u->right==NULL)
{
u->right=new Node();
u=u->right;
u->v=a[i];
break;
}
else u=u->right;
}
}
}
return root;
}
void preOrder(Node *u,int *a,int &ind)
{
a[ind++]=u->v;
if(u->left!=NULL) preOrder(u->left,a,ind);
if(u->right!=NULL) preOrder(u->right,a,ind);
}
void inOrder(Node *u,int *a,int &ind)
{
if(u->left!=NULL) inOrder(u->left,a,ind);
a[ind++]=u->v;
if(u->right!=NULL) inOrder(u->right,a,ind);
}
void getList(int *a,int &cnt)
{
int t[10];
int ind=0;
read(t,ind);
Node *root=build(t,ind);
preOrder(root,a,cnt);
inOrder(root,a,cnt);
}
const int maxn=20;
int a1[maxn],a2[maxn];
int main()
{
int n;
while(scanf("%d",&n)==1 && n)
{
int cnt1=0;
getList(a1,cnt1);
while(n--)
{
int cnt2=0;
getList(a2,cnt2);
bool ok=(cnt1==cnt2);
for(int i=0;i<cnt1;i++)
{
if(a1[i]!=a2[i])
{
ok=false;
break;
}
}
printf("%s\n",ok?"YES":"NO");
}
}
return 0;
}