进击的二叉查找树 【BST】

题意: 给定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; 
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值