Description
给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。
Input
每个输入文件中一组数据。
第一行1个正整数N(1<=N<=30),表示二叉查找树中的结点个数。
接下来两行,代表1~N的两个排列。
Output
如果两个排列代表的二叉查找树完全相同,那么输出一行YES,否则输出一行NO。
接下来两行分别输出第一个排列对应的二叉查找树的后序序列、层序序列,整数之间用空格隔开。
每行末尾不允许有多余的空格。
Sample Input
5 4 2 1 3 5 4 5 2 3 1
Sample Output
YES 1 3 2 5 4 4 2 5 1 3
![]()
/**************************************************************
Problem: 2943
User: 201717010009
Language: C++
Result: Accepted
Time:0 ms
Memory:1720 kb
****************************************************************/
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<malloc.h>
#include<bits/stdc++.h>
using namespace std;
int n,num,a[100],b[100],i;
int Q1[100],Z1[100],Q2[100],Z2[100];
typedef struct BSTNode{
int data;
struct BSTNode *lchild;
struct BSTNode *rchild;
}BSTNode,*PBSTNode;
PBSTNode insert(int data,PBSTNode *root){
if(*root == NULL)
{
*root=(PBSTNode)malloc(sizeof(BSTNode));
(*root)->data=data;
(*root)->lchild=NULL;
(*root)->rchild=NULL;
return *root;
}
if(data<(*root)->data)
(*root)->lchild=insert(data,&( (*root)->lchild) );
else if(data>(*root)->data)
(*root)->rchild=insert(data,&( (*root)->rchild) );
return *root;
}
void QX1(PBSTNode root){//得到第一序列的前序序列
if(root!=NULL)
{
Q1[i++]=root->data;
QX1(root->lchild);
QX1(root->rchild);
}
}
void ZX1(PBSTNode root){//得到第一序列的中序序列
if(root!=NULL)
{
ZX1(root->lchild);
Z1[i++]=root->data;
ZX1(root->rchild);
}
}
void QX2(PBSTNode root){//得到第二序列的前序序列
if(root!=NULL)
{
Q2[i++]=root->data;
QX2(root->lchild);
QX2(root->rchild);
}
}
void ZX2(PBSTNode root){//得到第二序列的中序顺序
if(root!=NULL)
{
ZX2(root->lchild);
Z2[i++]=root->data;
ZX2(root->rchild);
}
}
void HX(PBSTNode root){
if(root!=NULL)
{
HX(root->lchild);
HX(root->rchild);
printf("%d",root->data);
if(num<n-1){
cout<<" ";num++;
}
}
}
void CX(PBSTNode root){
PBSTNode q[100];
int w=1,t=1;//建队
if(root==NULL){
return ;
}
q[w++]=root;
while(t!=w){
if(q[t]->lchild!=NULL){
q[w++]=q[t]->lchild;
}
if(q[t]->rchild!=NULL){
q[w++]=q[t]->rchild;
}
cout<<q[t]->data;
if(num<n-1){
cout<<" ";num++;
}
t++;
}
}
int main(){
PBSTNode root1=NULL,root2=NULL;
cin>>n;
for(i=0;i<n;i++){
cin>>a[i];
insert(a[i],&root1);
}
for(i=0;i<n;i++){
cin>>b[i];
insert(b[i],&root2);
}
i=0;QX1(root1);
i=0;ZX1(root1);
i=0;QX2(root2);
i=0;ZX2(root2);
int flag=0;
for(i=0;i<n;i++){//比较前序序列
if(Q1[i]!=Q2[i]){
cout<<"NO"<<endl;
flag=1;break;
}
}
for(i=0;i<n;i++){//比较后序序列
if(flag==1)break;
if(Z1[i]!=Z2[i]){
cout<<"NO"<<endl;
flag=1;break;
}
}
if(!flag){
cout<<"YES"<<endl;
}
num=0;
HX(root1);
cout<<endl;
num=0;
CX(root1);
}