当前位置: 首页 > news >正文

数据结构实验:二叉排序树

题目描述

对应给定的一个序列可以唯一确定一棵二叉排序树。然而,一棵给定的二叉排序树却可以由多种不同的序列得到。例如分别按照序列{3,1,4}和{3,4,1}插入初始为空的二叉排序树,都得到一样的结果。你的任务书对于输入的各种序列,判断它们是否能生成一样的二叉排序树。

输入描述

输入包含若干组测试数据。每组数据的第1行给出两个正整数N(n≤10)和L,分别是输入序列的元素个数和需要比较的序列个数。第2行给出N个以空格分隔的正整数,作为初始插入序列生成一颗二叉排序树。随后L行,每行给出N个元素,属于L个需要检查的序列。
简单起见,我们保证每个插入序列都是1到N的一个排列。当读到N为0时,标志输入结束,这组数据不要处理。

输出描述

对每一组需要检查的序列,如果其生成的二叉排序树跟初始序列生成的二叉排序树一样,则输出"Yes",否则输出"No"。

样例

输入
4 2
3 1 4 2
3 4 1 2
3 2 4 1
2 1
2 1
1 2
0
输出
Yes
No
No


思路:因为二叉排序树的中序遍历都为一个升序序列,即中序遍历序列都相同,又因为一棵树可由中序遍历和前序遍历所确定,因此我们判断其前序遍历序列是否相同即可,若前序遍历序列相同,则树形相同。

建树过程

  • 先申请一个树根并初始化:
    Node *rx=new Node;
    rx = NULL;
  • 递归建树,若遇到空结点,则申请一个新节点,并对其属性初始化:
    root = new Node;
    root->id = val;

Code:

#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10;
struct Node {Node* left=NULL;Node* right=NULL;int id;
};
vector<int> p,q;
map<vector<int>,bool> mp;
Node* build(Node *root,int val) {if(root == NULL) {root = new Node;root->id = val;} else if(val>=root->id) root->right = build(root->right,val);else root->left = build(root->left,val);return root;
}
void work1(Node *root) {if(root == NULL) return;p.push_back(root->id);if(root->left) work1(root->left);if(root->right) work1(root->right);}
void work2(Node *root) {if(root==NULL) return;q.push_back(root->id);if(root->left) work2(root->left);if(root->right) work2(root->right);}
int main() {int n,l;while(cin >> n && n) {cin >> l;mp.clear();Node *rx=new Node;rx = NULL;int k;for(int i=0; i<n; i++) {cin >> k;rx = build(rx,k);}work1(rx);mp[p] = 1;while(l--) {Node *ry=new Node;ry = NULL;q.clear();for(int j=0; j<n; j++) {cin >> k;ry = build(ry,k);}work2(ry);mp[q]==1?puts("Yes"):puts("No");}}return 0;
}
http://www.lryc.cn/news/312984.html

相关文章:

  • Java类加载流程?
  • Docker从0到1的开始【入门篇】
  • @ResponseStatus
  • 高效加载大文件(pandas+dask)
  • 游戏引擎分层简介
  • 向爬虫而生---Redis 探究篇6<Redis的Bigkey问题介绍>
  • 【开源物联网平台】FastBee认证方式和MQTT主题设计
  • Ubuntu Qt控制终端运行ros
  • mysql 性能调优参数配置文件
  • windows右键新建文件没有txt文本文档怎么办?
  • 已读不回,我又玻璃心了
  • 面试经典150题(105-107)
  • javaWebssh药品进销存信息管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  • 计算机设计大赛 深度学习实现语义分割算法系统 - 机器视觉
  • Linux系统编程(六)高级IO
  • Python与FPGA——全局二值化
  • 《Docker极简教程》--Docker的高级特性--Docker Compose的使用
  • tidyverse去除表格中含有NA的行
  • 开源爬虫技术在金融行业市场分析中的应用与实战解析
  • 使用SMTP javamail发送邮件
  • Hello C++ (c++是什么/c++怎么学/c++推荐书籍)
  • 最新的前端开发技术(2024年)
  • GCN 翻译 - 2
  • HBase 的安装与部署
  • 236.二叉搜索树的公共祖先
  • 【论文精读】大语言模型融合知识图谱的问答系统研究
  • LabVIEW高精度天线自动测试系统
  • 7.3 支付模块 - 创建订单、查询订单、通知
  • 灵魂指针,教给(一)
  • Linux 开发工具 yum、git、gdb