题目描述
数据结构实验之查找一:二叉排序树
Time Limit: 400 ms Memory Limit: 65536 KiB
Submit Statistic Discuss
Problem Description
对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树。
Input
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (n < = 10)和L,分别是输入序列的元素个数和需要比较的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列生成一颗二叉排序树。随后L行,每行给出N个元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
Output
对每一组需要检查的序列,如果其生成的二叉排序树跟初始序列生成的二叉排序树一样,则输出”Yes”,否则输出”No”。
Sample Input
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
Sample Output
Yes
No
No
代码 & 分析
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
int n,l;
struct node{
int data;
struct node * left;
struct node * right;
};
typedef node * tree;
int ins(tree &t, int key){
if(t==NULL){
t = new node;
t->data = key;
t->right = NULL;
t->left = NULL;
}
else{
if(t->data > key)
ins(t->left, key);
if(t->data < key)
ins(t->right, key);
}
}
int comp(tree a, tree b){ //判断树同构的代码 树都可以使用
if(a==NULL && b==NULL){ // 从树根开始 依次判断对应节点 1.都为空 相同 返回0
return 0; // 2. 只有一个为空 不同 返回1
} // 3. 都不为空 但是值不同 不同 返回1
else if(a==NULL || b==NULL){ // 最后递归调用 返回左右的结果 所以 不同的时候返回1 相同返回0
return 1;
}
else if(a->data != b->data){
return 1;
}
else{
return comp(a->left, b->left) + comp(a->right, b->right);
}
}
int main(){
while(cin>>n && n){
cin>>l;
tree t=NULL;
int temp;
for(int i=0; i<n; i++){
cin>>temp;
ins(t, temp);
}
for(int i=0; i<l; i++){
tree temptree = NULL;
for(int i=0; i<n; i++){
cin>>temp;
ins(temptree, temp);
}
if(!comp(t, temptree)){
cout<<"Yes"<<endl;
}
else
cout<<"No"<<endl;
}
}
}