时间限制: 1 Sec 内存限制: 32 MB
提交: 318 解决: 159
[提交][状态][讨论版][命题人:外部导入]
题目描述
判断两序列是否为同一二叉搜索树序列
输入
开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。
接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。
接下去的n行有n个序列,每个序列格式跟第一个序列一样,请判断这两个序列是否能组成同一颗二叉搜索树。
输出
如果序列相同则输出YES,否则输出NO
样例输入
6 45021 12045 54120 45021 45012 21054 50412 0
样例输出
NO NO YES NO NO NO
思路:
判断两颗树是否相等,只需要判断中序和先序序列是否一致就行。用变长数组vector存,方便于判断俩“数组”是否相等。
#include<iostream>
#include<string>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
using namespace std;
struct node{
int data;
node* lchild;
node* rchild;
};
void pre(node* root,vector<int> &v){
if(root==NULL)
return ;
v.push_back(root->data);
pre(root->lchild,v);
pre(root->rchild,v);
}
void in(node* root,vector<int> &v){
if(root==NULL)
return ;
in(root->lchild,v);
v.push_back(root->data);
in(root->rchild,v);
}
void insert(node* &root,int data){
if(root==NULL){
//root指向空地址,然后让root指向一个具体的地址
root=new node;
root->data=data;
root->lchild=root->rchild=NULL;
return ;
}
//递归边界与递归式,边界一定要记得返回
if(data<root->data)
insert(root->lchild,data);
else if(data>root->data)
insert(root->rchild,data);
}
int main(){
int n;
string str,str1;
while(cin>>n){
if(!n) break;
//root
cin>>str;
node* root=NULL;
for(int i=0;i<str.size();i++){
int k=str[i]-'0';
insert(root,k);
}
vector<int> Pre,In;
pre(root,Pre);
in(root,In);
//else
for(int i=0;i<n;i++){
cin>>str1;
//build a tree
node* root1=NULL;
for(int i=0;i<str1.size();i++){
int k=str1[i]-'0';
insert(root1,k);
}
//get pre in
vector<int> Pre1,In1;
pre(root1,Pre1);
in(root1,In1);
//judge
if(Pre1==Pre&&In1==In){
cout<<"YES"<<endl;
}
else{
cout<<"NO"<<endl;
}
}
}
}