xynuoj2489 进击的二叉查找树 建树判同 后序层序

本文介绍了一个算法问题:给定两个排列,构建两棵二叉查找树,并判断它们是否相同。若相同则输出YES,否则输出NO。此外,还展示了如何输出第一个排列对应的二叉查找树的后序序列及层序序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值