二叉搜索树
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 3 Accepted Submission(s) : 3
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
判断两序列是否为同一二叉搜索树序列
Input
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
Output
如果序列相同则输出YES,否则输出NO
Sample Input
2 567432 543267 576342 0
Sample Output
YES NO
Source
浙大计算机研究生复试上机考试-2010年
数据结构:树:二叉搜索树。
注意二叉树和二叉搜索树(BST)的概念是不同的,二叉搜索树是一种特殊的二叉树。它符合规律:所有节点的左孩子节点的值小于它根节点的值,右孩子节点的值大于根节点的值。就是小数放左边,大数放右边,来构成一棵二叉树。(还不明白的点击上面有下划线的深色链接)
一开始没有搞明白两者的区别,以为二叉搜索树就是二叉树,这让我在构造二叉树的时候产生了疑惑,因为根据数据结构书上的描述,二叉树可以根据前序、中序、后序序列构造,这样产生的结果就是不唯一的。最后还是查找了一下二叉搜索树的概念才明白过来。根据它的规则就可以根据一个序列构成一个唯一的二叉搜索树了!而同一个二叉搜索树却可以有不同的序列来描述。这就产生了这道题的题意:给你两个不同的序列判断是否能构造出同一个二叉搜索树。
思路:那么我们就可以根据二叉搜索树的生成规则先将一开始给你的序列生成一个二叉搜索树用tree[]存储起来,然后输入n个序列,每一个序列都生成一个二叉搜索树建立一个临时数组tree2[]存储,比较两个数组是否相同,相同输出“YES”,不同输出“NO”。
本题代码:
1 #include <iostream>
2 #include <string.h>
3 using namespace std;
4 int main()
5 {
6 char l1[10];
7 int n;
8 while(cin>>n){
9 if(n==0) break;
10 cin>>l1;
11 int tree[1025];
12 memset(tree,-1,sizeof(tree));
13 for(int i=0;l1[i];i++){ //构造二叉搜索树
14 int num = l1[i] - '0';
15 int j = 1;
16 while(tree[j]!=-1){
17 if(num <= tree[j])
18 j = j*2;
19 else
20 j = j*2 + 1;
21 }
22 tree[j] = num;
23 }
24 while(n--){ //输入n个序列
25 char l2[10];
26 cin>>l2;
27 int tree2[1025];
28 memset(tree2,-1,sizeof(tree2));
29 for(int i=0;l2[i];i++){ //构造比较二叉搜索树
30 int num = l2[i] - '0';
31 int j = 1;
32 while(tree2[j]!=-1){
33 if(num <= tree2[j])
34 j = j*2;
35 else
36 j = j*2 + 1;
37 }
38 tree2[j] = num;
39 }
40 int i;
41 for(i=0;i<=1024&&tree[i]==tree2[i];i++); //比较
42 if(i>1024)
43 cout<<"YES"<<endl;
44 else
45 cout<<"NO"<<endl;
46 }
47 }
48 return 0;
49 }
Freecode : www.cnblogs.com/yym2013