题意概述:
给出两个二叉搜索树的生成序列,判断是否能生成相同的二叉搜索树。
解决:
二叉搜索树的生成序列有以下的特点:
- 根结点在最前面
- 左子树为小于根结点的所有结点,右子树为大于根结点的所有结点
而我们又知道:
如果两个树相同,只需要使他们的根结点、左子树、右子树相同就行了。
而左子树和左子树相同又成为了一个本问题的小问题,所以我想到了使用递归来设计函数。
判断函数:
bool IfEqual(string a,string b){//使用字符串来存储序列
if((a.size()==1&&b.size()==1&&a[0]==b[0])||(a.empty()&&b.empty())) return 1;//如果生成序列为空,则相同;如果序列只有一个元素且相同,则相同
else if(a[0]!=b[0]) return 0;//如果根结点不同则两序列生成树不同
else {
string la,ra,lb,rb;//生成左右子树的序列
for(int i:a){
if(i<a[0]) la.push_back(i);
else if(i>a[0])ra.push_back(i);
}
for(int i:b){
if(i<b[0]) lb.push_back(i);
else if(i>b[0]) rb.push_back(i);
}
return IfEqual(la,lb)&&IfEqual(ra,rb);//根结点和左子树和右子树分别都相同
}
}
总体思路是:
设有a,b两个序列待判断是否相同
IfEqual(a,b) = Root(a)==Root(b) && IfEqual(lchildTree(a),lchildTree(b))&&IfEqual(rchildTree(a),rchildTree(b))
总体代码:
//
// Created by MacBook on 2020/6/16.
//
#include <iostream>
#include <string>
using namespace std;
bool IfEqual(string a,string b){
if((a.size()==1&&b.size()==1&&a[0]==b[0])||(a.empty()&&b.empty())) return 1;
else if(a[0]!=b[0]) return 0;
else {
string la,ra,lb,rb;
for(int i:a){
if(i<a[0]) la.push_back(i);
else if(i>a[0])ra.push_back(i);
}
for(int i:b){
if(i<b[0]) lb.push_back(i);
else if(i>b[0]) rb.push_back(i);
}
return IfEqual(la,lb)&&IfEqual(ra,rb);//根结点和左子树和右子树分别都相同
}
}
int main(){
string pure,b;
int n;
while( cin>>n && n != 0){
cin>>pure;
while(n--){
cin>>b;
cout<<(IfEqual(pure,b)==1?"YES":"NO")<<endl;
}
}
return 0;
}