题意: 给定1~N的两个排列,使用这两个排列分别构建两棵二叉查找树(也就是通过往一棵空树中依次插入序列元素的构建方式)。如果这两棵二叉查找树完全相同,那么输出YES;否则输出NO。之后,输出第一个排列对应的二叉查找树的后序序列、层序序列。题目链接~
https://logn.me/problem/1008
分析:这就涉及BST的重建了,简单的模板题。
代码:
#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;
}