Problem 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
#include <cstdio>
#include <queue>
using namespace std;
struct node{
int data;
node *left, *right;
};
int n;
int num = 0;
void insert(node* &root, int data){
if(root == NULL){
root = new node;
root->data = data;
root->left = root->right = NULL;
return;
}
if(data < root->data)
insert(root->left, data);
else
insert(root->right, data);
}
void LevelOrder(node* root){
queue<node*> q;
q.push(root);
while(!q.empty()){
node* now = q.front();
q.pop();
printf("%d", now->data);
num++;
if(num < n){
printf(" ");
}
if(now->left != NULL)
q.push(now->left);
if(now->right != NULL)
q.push(now->right);
}
}
void postOrder(node* root){
if(root == NULL)
return;
postOrder(root->left);
postOrder(root->right);
printf("%d", root->data);
num++;
if(num < n){
printf(" ");
}
}
bool isSame(node* root1, node* root2){
if(root1 == NULL && root2 == NULL)
return true;
else if(root1 == NULL || root2 == NULL)
return false;
else if(root1->data == root2->data){
if(isSame(root1->left, root2->left) && isSame(root1->right, root2->right)){
return true;
}
else
return false;
}
else{
return false;
}
}
int main(){
scanf("%d", &n);
node* root1 = NULL;
int data;
for(int i = 0; i < n; i++){
scanf("%d", &data);
insert(root1, data);
}
node* root2 = NULL;
for(int i = 0; i < n; i++){
scanf("%d", &data);
insert(root2, data);
}
if(isSame(root1, root2)){
printf("YES\n");
}
else{
printf("NO\n");
}
postOrder(root1);
printf("\n");
num = 0;
LevelOrder(root1);
return 0;
}