2489: 进击的二叉查找树
时间限制: 1 Sec 内存限制: 64 MB提交: 11 解决: 7
您该题的状态:已完成
[提交][状态][讨论版][Edit] [TestData]
题目描述
给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。
输入
每个输入文件中一组数据。
第一行1个正整数N(1<=N<=30),表示二叉查找树中的结点个数。
接下来两行,代表1~N的两个排列。
输出
如果两个排列代表的二叉查找树完全相同,那么输出一行YES,否则输出一行NO。
接下来两行分别输出第一个排列对应的二叉查找树的后序序列、层序序列,整数之间用空格隔开。
每行末尾不允许有多余的空格。
样例输入
54 2 1 3 54 5 2 3 1
样例输出
YES1 3 2 5 44 2 5 1 3
提示
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50;
int layer[50], in[50], pre[50];
int n,idx=0;
struct Node{
int data;
Node *lchild,*rchild;
};
void preOrder(Node *root){
if(root == NULL) return;
printf("%d", root->data);
idx++;
if(idx != n) printf(" ");
preOrder(root->lchild);
preOrder(root->rchild);
}
void inOrder(Node *root){
if(root == NULL) return;
inOrder(root->lchild);
printf("%d", root->data);
idx++;
if(idx != n) printf(" ");
inOrder(root->rchild);
}
void postOrder(Node *root){
if(root == NULL) return;
postOrder(root->lchild);
postOrder(root->rchild);
printf("%d", root->data);
idx++;
if(idx != n) printf(" ");
}
Node *root1,*root2 ;
bool flag = true;
void cmp(Node *r1, Node *r2){
if(r1 == NULL)
return;
if(r1->data != r2->data){
flag = false;
return;
}
cmp(r1->lchild, r2->lchild);
cmp(r1->rchild, r2->rchild);
}
//插入构建二叉查找树
void insert(Node* &node, int x){
if(node == NULL){
node = new Node;
node->data = x;
node->lchild = NULL;
node->rchild = NULL;
return;
}
else {
if(x < node->data){
insert(node->lchild , x);
}
else insert(node->rchild, x);
}
}
//二叉查找树的层序遍历
void bfs(Node* node){
idx=0;
queue<Node*> q;
q.push(node);
while(!q.empty()){
Node* now = q.front();
q.pop();
printf("%d", now->data);
idx++;
if(idx != n) printf(" ");
if(now->lchild != NULL) q.push(now->lchild);
if(now->rchild != NULL) q.push(now->rchild);
}
}
int main()
{
scanf("%d", &n);
for(int i = 0; i<n; i++)
scanf("%d", &layer[i]);
for(int i = 0; i<n; i++)
scanf("%d", &in[i]);
for(int i = 0; i<n; i++){
insert(root1, layer[i]);
}
for(int i = 0; i<n; i++){
insert(root2, in[i]);
}
cmp(root1, root2);
if(flag)
printf("YES\n");
else
printf("NO\n");
postOrder(root1);
printf("\n");
bfs(root1);
return 0;
}