浙大版《数据结构学习与实验指导(第2版)》笛卡尔树

笛卡尔树

题目描述

笛卡尔树是一种特殊的二叉树,其结点包含两个关键字K1和K2。首先笛卡尔树是关于K1的二叉搜索树,即结点左子树的所有K1值都比该结点的K1值小,右子树则大。其次所有结点的K2关键字满足优先队列(不妨设为最小堆)的顺序要求,即该结点的K2值比其子树中所有结点的K2值小。给定一棵二叉树,请判断该树是否笛卡尔树。

输入描述

输入首先给出正整数N(1<=N<=1000),为树中结点的个数。随后N行,每行给出一个结点的信息,包括:结点的K1值、K2值、左孩子结点编号、右孩子结点编号。设结点从0到(N-1)顺序编号。若某结点不存在孩子结点,则该位置给出−1。

输出描述

输出YES如果该树是一棵笛卡尔树;否则输出NO。

样例

输入
6
8 27 5 1
9 40 -1 -1
10 20 0 3
12 21 -1 4
15 22 -1 -1
5 35 -1 -1
输出
YES


思路:

  1. 先利用并查集找到树根,然后从根开始遍历
  2. work1返回的是此节点及其所有子树中所有节点的最大值。根据笛卡尔树定义可得出判断条件:
    • 若当前节点k1 <= work1(a[root].l) 则不是笛卡尔树
    • 若当前节点k1 >= work1(a[root].r) 则不是笛卡尔树
  3. work2返回的是此节点及其所有子树中所有节点的最小值。根据笛卡尔树定义可得出判断条件:
    • 若当前节点k2 >= min(work2(a[root].l),work2(a[root].r)) 则不是笛卡尔树

Code:

#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 10;
const int N = 1e6 + 10;
struct Node {int k1,k2;int l,r;
} a[1010];
int p[1010];
int find(int x) {return p[x]==x?x:p[x]=find(p[x]);
}
bool ok1=1,ok2=1;
int work1(int root) {int t1,t2;t1=t2=-1;if(a[root].l!=-1) t1 = work1(a[root].l);if(a[root].r!=-1) t2 = work1(a[root].r);if(t1!=-1 && a[root].k1<=t1) ok1=0;if(t2!=-1 && a[root].k1>=t2) ok1=0;return max(a[root].k1,max(t1,t2));
}
int work2(int root) {int t1,t2;t1=t2=INF;if(a[root].l!=-1) t1 = work2(a[root].l);if(a[root].r!=-1) t2 = work2(a[root].r);if(a[root].k2>=min(t1,t2)) ok2=0;return min(a[root].k2,min(t1,t2));
}
int main() {int n;cin >> n;for(int i=0; i<n; i++) p[i]=i;for(int i=0; i<n; i++) {cin >> a[i].k1 >> a[i].k2 >> a[i].l >>a[i].r;p[a[i].l] = i;p[a[i].r] = i;}int root;for(int i=0; i<n; i++) {if(find(i)==i) {root=i;break;}}work1(root);work2(root);if(ok1&&ok2) puts("YES");else puts("NO");return 0;
}/**/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/746648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实景剧本杀小程序开发搭建

开发搭建实景剧本杀小程序需要以下步骤&#xff1a; 1. 确定小程序的开发语言和框架&#xff1a;根据项目需求和小程序的功能选择合适的开发语言和框架&#xff0c;如微信小程序、React Native等。 2. 设计小程序界面和功能&#xff1a;根据项目需求设计小程序界面和功能&…

MySQL--索引常见面试题详解

索引的设计原则&#xff1f; 在 where 子句中出现的列&#xff0c;建议设计索引。基数较小的列&#xff0c;不建议设计索引。尽量只用短索引&#xff0c;可以节省索引空间。不要过度索引&#xff0c;多设计联合索引&#xff0c;因为索引也有时间和空间的消耗。 创建索引需要注…

【css面试题】弹性盒布局模型 flex 全部知识点整理

一、基本语法 flex-basis 在分配多余空间之前&#xff0c;占据的主轴空间&#xff0c;相当于 widthflex-grow 定义项目的放大比例(存在剩余空间是否放大)默认为0 &#xff08;即如果存在剩余空间也不放大&#xff09;flex-shrink 定义项目的缩小比例&#xff08;空间不足&…

Mysql隔离级别的实现

Mysql隔离级别的实现 mysql隔离级别是通过MVCC锁来实现的&#xff0c;MVCC用来实现读已提交、可重复读 Mysql幻读的解决 1.针对快照读&#xff0c;通过 MVCC 方式解决了幻读 补充:串行化所有的数据库都没做&#xff0c;不过mvcc实现的效果跟串行化差不太多了&#xff0c;可以…

突飞猛进,智能饮品机器人如何助力实体经济?

近日&#xff0c;财务部公布了2024年第一季度及全年财报。数据显示&#xff0c;连锁品牌增长速度惊人&#xff0c;这其中不得不提到智能饮品机器人的使用&#xff0c;为不同的品牌门店拼速度、抢点位立下了不小的功劳&#xff0c;那么智能饮品机器人到底如何助力各门店&#xf…

Outlook API发送邮件的方法?如何设置接口?

如何使用Outlook API发送电子邮件&#xff1f;怎么调用API接口&#xff1f; 为了满足更高级别的需求&#xff0c;我们可能需要通过编程的方式来操作Outlook&#xff0c;这时候&#xff0c;Outlook API就显得尤为重要了。那么&#xff0c;如何使用Outlook API发送邮件呢&#x…

Spring Security自定义认证授权过滤器

自定义认证授权过滤器 自定义认证授权过滤器1、SpringSecurity内置认证流程2、自定义Security认证过滤器2.1 自定义认证过滤器2.2 定义获取用户详情服务bean2.3 定义SecurityConfig类2.4 自定义认证流程测试 3、 基于JWT实现无状态认证3.1 认证成功响应JWT实现3.2 SpringSecuri…

OceanBase中binlog service 功能的试用

OBLogProxy简介 OBLogProxy即OceanBase的增量日志代理服务&#xff0c;它可与OceanBase建立连接并读取增量日志&#xff0c;从而为下游服务提供了变更数据捕获&#xff08;CDC&#xff09;的功能。 关于OBLogProxy的详尽介绍与具体的安装指引&#xff0c;您可以参考这篇官方OB…

基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程

原文链接&#xff1a;基于R语言的水文、水环境模型优化技术及快速率定方法与多模型教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597847&idx7&snd71869f1290d0ef9dd7fd3f74dd7ca33&chksmfa823ef0cdf5b7e655af5e773a3d3a1b200632a5981f99fe72f0…

普林斯顿算法讲义(一)

原文&#xff1a;普林斯顿大学算法课程 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 1. 基础知识 原文&#xff1a;algs4.cs.princeton.edu/10fundamentals 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 概述。 本书的目标是研究各种重要和有用的算法——…

多线程编程

多线程写作类 倒计时协调器CountDownLatch 某个线程需要等待其他线程执行到特定操作结束即可。例如&#xff1a;在多Web服务中&#xff0c;在启动指定服务时需要启动若干启动过程中比较耗时的服务&#xff0c;为了尽可能减少服务启动过程的总耗时&#xff0c;该服务会使用专门…

深入探讨MES管理系统与MOM系统之间的关系

在制造业的信息化浪潮中&#xff0c;各种系统与技术层出不穷&#xff0c;其中MES制造执行系统和MOM制造运营管理无疑是备受瞩目的两大主角。尽管它们都是制造业信息化不可或缺的部分&#xff0c;但许多人对它们之间的区别与联系仍感到困惑。本文将对MES管理系统和MOM系统进行深…

uniapp小程序上传oss

uniapp上传小程序代码 import crypto from crypto-js; import { Base64 } from js-base64/base64.js; // 计算oss签名。 function computeSignature(accessKeySecret, canonicalString) {return crypto.enc.Base64.stringify(crypto.HmacSHA1(canonicalString, accessKeySecre…

#数据结构 线性表的顺序存储

目录 每日文案 一、线性表的定义 二、线性表的操作 顺序表的存储结构 顺序表的初始化操作 判断顺序表是否为空表 将顺序表置为空表 计算顺序表中的元素个数 取出顺序表中的对应位置元素 取出对应数值的位序 在对应位置插入元素 将对应位置的元素删除 将顺序表中的数据…

1.Python数据分析—数据分析与挖掘详讲

1.Python数据分析—数据分析与挖掘详讲 一个人简介二数据分析与挖掘概述三什么是数据分析和挖掘四数据分析与挖掘在不同领域的应用4.1医疗领域&#xff1a;4.1.1 建立疾病数据库&#xff1a;4.1.2 临床决策支持&#xff1a;4.1.3 疾病预警和监控&#xff1a; 4.2 电子商务领域&…

Linux下platform驱动框架编写

一. 简介 前面一篇文章简单学习了 Linux内核中platform驱动代码。文章地址如下&#xff1a; Linux下platform驱动简介-CSDN博客 本文学习编写 platform驱动框架代码。 二. Linux下platform驱动框架编写 1. 编写platform驱动代码的思路 &#xff08;1&#xff09; 定义结…

第12章 指针

以下内容是学习尚硅谷 12.1 指针基本介绍 1&#xff09;指针是C语言的精华&#xff0c;也是C语言的难点 2&#xff09;指针&#xff0c;也就是内存的地址&#xff1b;所谓指针变量&#xff0c;也就是保存了内存地址的变量。关于指针的基本使用&#xff0c;在讲变量的时候做了…

WAPI模块AT指令驱动

一、前言 由于项目更迭&#xff0c;需要将原4G模块更换为国内的WAPI协议模块&#xff0c;主控芯片NRF52840无需改动其他部分&#xff0c;只需要将串口部分的数据格式稍作更改即可。 编程风格和之前的esp8266一致&#xff0c;同样都是AT指令来配置模块&#xff0c;由于主…

Java封装的优点

目录 提高代码可维护性 降低耦合度 保护数据安全性 封装如何提高安全性 数据隐藏 访问控制 限制接口 错误隔离

请解释Redis是什么?它有哪些主要应用场景?Redis支持哪些数据类型?并描述每种数据类型的特性和使用场景。

请解释Redis是什么&#xff1f;它有哪些主要应用场景&#xff1f; Redis是一款内存高速缓存NoSQL数据库&#xff0c;使用C语言编写&#xff0c;它支持丰富的数据类型&#xff0c;如String、list、set、zset、hash等&#xff0c;并且这些数据类型都直接支持数据的原子性操作&…