判断两序列是否为同一二叉搜索树序列
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
题意:
解题思路:
见代码以及注释
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
int tree1[10000];
int tree2[10000];
void Insert(char word,int *tree)
{
//now表示第几个结点,c表示now结点中的值
int now=1;
int c=word-'0';
while(tree[now]!=-1)//如果结点有值,根左右子结点比较
{
if(tree[now]<c)
now=now*2+1;
else now=now*2;
}
tree[now]=c;//比较后确定该值的位置
}
void build(char *str,int *tree)//构建二叉搜索树
{
int l=strlen(str);
tree[1]=str[0]-'0';
for(int i=1;i<l;i++)//一个一个数的插入
{
Insert(str[i],tree);
}
}
int main()
{
int n;
char str[1000];
while(~scanf("%d",&n)&&n)
{
memset(tree1,-1,sizeof(tree1));
scanf("%s",str);
build(str,tree1);
for(int i=0;i<n;i++)
{
memset(tree2,-1,sizeof(tree2));
scanf("%s",str);
build(str,tree2);
int j;
for(j=0;j<5000;j++)
{
if(tree1[j]!=tree2[j])
break;
}
if(j==5000) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
/* 二叉查找树又:二叉搜索树,二叉排序树 它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。 注意二叉树和二叉搜索树(BST)的概念是不同的,二叉搜索树是一种特殊的二叉树。 它符合规律:所有节点的左孩子节点的值小于它根节点的值,右孩子节点的值大于根节点的值。就是小数放左边,大数放右边,来构成一棵二叉树。 一开始没有搞明白两者的区别,以为二叉搜索树就是二叉树,这让我在构造二叉树的时候产生了疑惑,因为根据数据结构书上的描述,二 叉树可以根据前序、中序、后序序列构造,这样产生的结果就是不唯一的。 最后还是查找了一下二叉搜索树的概念才明白过来。根据它的规则就可以根据一个序列构成一个唯一的二叉搜索树了! 而同一个二叉搜索树却可以有不同的序列来描述。这 就产生了这道题的题意:给你两个不同的序列判断是否能构造出同一个二叉搜索树。 思路:那么我们就可以根据二叉搜索树的生成规则先将一开始给你的序列生成一个二叉搜索树用tree[]存储起来, 然后输入n个序列,每一个序列都生成一个二叉搜索树建立一个临时数组tree2[]存储,比较两个数组是否相同,相同输出“YES”,不同输出“NO”。 */