二叉排序树:左<根<右
- 相同元素的二叉排序树的中序遍历必定相同(升序)
- 先序遍历相同→元素相同(中序遍历相同)→二叉排序树相同
#include<iostream>
#include<string>
using namespace std;
struct node{
int data;
node* leftch;
node* rightch;
node(int x):data(x),leftch(nullptr),rightch(nullptr){}
};
node* insert(int a,node* root){//插入
if(root==nullptr){
root=new node(a);
return root;
}
if(a>root->data){
root->rightch=insert(a,root->rightch);
}
else if(a<root->data){
root->leftch=insert(a,root->leftch);
}
return root;
}
bool preorder(node* root0,node* root1){//比较先序遍历
if(root0==nullptr&&root1==nullptr)return true;//递归出口
else if((root0==nullptr&&root1!=nullptr)||root1==nullptr&&root0==nullptr)return false;
if(root0->data!=root1->data)return false;//比较当前结点数据
return preorder(root0->leftch,root1->leftch)&&preorder(root0->rightch,root1->rightch);//递归
}
int main(){
string s0,s1;
int n;
while(scanf("%d",&n)!=EOF){
if(n==0)break;
cin>>s0;
node* root0=nullptr;
for(int i=0;i<s0.size();i++){
root0=insert(s0[i]-'0',root0);
}
for(int j=0;j<n;j++){
cin>>s1;
node* root1=nullptr;
for(int i=0;i<s1.size();i++){
root1=insert(s1[i]-'0',root1);
}
if(preorder(root0,root1))printf("YES\n");
else printf("NO\n");
}
}
return 0;
}