给定一个插入序列就可以唯一确定一棵二叉搜索树。然而,一棵给定的二叉搜索树却可以由多种不同的插入序列得到。例如分别按照序列{2, 1, 3}和{2, 3, 1}插入初始为空的二叉搜索树,都得到一样的结果。于是对于输入的各种插入序列,你需要判断它们是否能生成一样的二叉搜索树。
输入格式:
输入包含若干组测试数据。每组数据的第1行给出两个正整数N (≤10)和L,分别是每个序列插入元素的个数和需要检查的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列。最后L行,每行给出N个插入的元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。
输出格式:
对每一组需要检查的序列,如果其生成的二叉搜索树跟对应的初始序列生成的一样,输出“Yes”,否则输出“No”。
输入样例:
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出样例:
Yes
No
No
鸣谢青岛大学周强老师补充测试数据!
#include<cstdio>
#include<iostream>
using namespace std;
#include<queue>
int key[15],cmp[15];
typedef struct balancetree *treenode;
typedef struct balancetree{
int data;
treenode left;
treenode right;
}node;
queue<treenode> listtemp,lista;
//搜索树插入函数
treenode inserta(int numi,treenode bst){
treenode temp;
if(!bst){
temp = new node;
temp->left = NULL;
temp->right = NULL;
temp->data=numi;
return temp;
}
else if(numi>bst->data){
bst->right = inserta(numi,bst->right);
}
else if(numi<bst->data){
bst->left = inserta(numi,bst->left);
}
return bst;
}
//层序遍历算法
void levelordertraversal(treenode bst){
treenode exist;
if(!bst) return;
else{
listtemp.push(bst);
lista.push(bst);
while(!listtemp.empty()){
exist=listtemp.front();
listtemp.pop();
if(exist->left!=NULL) {
listtemp.push(exist->left);
lista.push(exist->left);
}
if(exist->right!=NULL) {
listtemp.push(exist->right);
lista.push(exist->right);
}
}
}
return;
}
void transmit(int flag){
int i=0;
treenode temptree;
while(!lista.empty()){
temptree=lista.front();
lista.pop();
if(flag==1) key[i]=temptree->data;
else cmp[i]=temptree->data;
i++;
}
return;
}
int main(){
int n,l,i,j,tempnum,t,first=1;
int output;
treenode keytree,cmptree,temptree;
while(1){
cin>>n;//geshu
if(n==0) break;
cin>>l;//hangshu
for(i=0;i<=l;){
if(i==0){
//first key
cin>>tempnum;
keytree=inserta(tempnum,NULL);
for(j=1;j<n;j++){
cin>>tempnum;
inserta(tempnum,keytree);
}
i++;
levelordertraversal(keytree);
transmit(1);
continue;
}
cin>>tempnum;
cmptree=inserta(tempnum,NULL);
for(j=1;j<n;j++){
cin>>tempnum;
inserta(tempnum,cmptree);
}
//比较两个树并且输出
levelordertraversal(cmptree);
transmit(0);
for(t=0,output=0;t<n;t++){
if(key[t]!=cmp[t]){
output=1;
break;
}
}
// if(!first) cout<<endl;
// if(first) first=0;
if(output) cout<<"No"<<endl;
else cout<<"Yes"<<endl;
i++;
}
}
}