C++ 笛卡尔树

目录

    • 一、性质
    • 二、构建笛卡尔树
    • 三、应用
    • 四、源码

一、性质

  1. 堆性质: 笛卡尔树是一种满足堆性质的树。每个节点包含两个值:键值(key)和优先级值(priority)。在笛卡尔树中,根节点的优先级值最大,且每个节点的优先级值大于其子节点的优先级值。

  2. 中序遍历: 笛卡尔树的中序遍历结果与原始数组的顺序一致。这意味着,如果你将笛卡尔树按中序遍历的顺序输出,就会得到原始数组的顺序。

  3. 唯一性: 对于给定的键值数组,存在唯一的笛卡尔树与之对应。

在这里插入图片描述(备注:图源于 维基百科)

二、构建笛卡尔树

  1. 笛卡尔树通常是通过一个数组构建的,数组中的元素按照顺序表示树中节点的键值,另一个数组表示节点的优先级值。
  2. 通过递归的方式构建笛卡尔树:在给定数组范围内,找到优先级值最大的元素作为根节点,然后递归构建左子树和右子树。

三、应用

  1. 最小公共祖先(LCA): 通过构建笛卡尔树,可以在O(1)时间内找到任意两个节点的最小公共祖先。

  2. 区间最小值/最大值查询: 通过构建笛卡尔树,可以在O(log n)时间内查询给定区间的最小值或最大值。

四、源码

#include <iostream>
#include <vector>using namespace std;struct Node {int key;int priority;Node* left;Node* right;Node(int k, int p) : key(k), priority(p), left(nullptr), right(nullptr) {}
};Node* buildCartesianTree(vector<int>& arr, vector<int>& priority, int start, int end) {if (start > end) {return nullptr;}int maxIndex = start;for (int i = start + 1; i <= end; i++) {if (priority[i] > priority[maxIndex]) {maxIndex = i;}}Node* root = new Node(arr[maxIndex], priority[maxIndex]);root->left = buildCartesianTree(arr, priority, start, maxIndex - 1);root->right = buildCartesianTree(arr, priority, maxIndex + 1, end);return root;
}void inOrderTraversal(Node* root) {if (root) {inOrderTraversal(root->left);cout << "(" << root->key << ", " << root->priority << ") ";inOrderTraversal(root->right);}
}int main() {vector<int> arr = { 9,3,7,1,8,12,10,20,15,18,5 };vector<int> priority = { 8,10,8,11,8,4,5,2,4,2,10 };Node* root = buildCartesianTree(arr, priority, 0, arr.size() - 1);cout << "Inorder traversal of Cartesian Tree: ";inOrderTraversal(root);cout << endl;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 特殊类及单例模式

文章目录 1. 前言2. 不能被拷贝的类3. 不能被继承的类4. 只能在堆上创建对象的类5. 只能在栈上创建对象的类6. 只能创建一个对象的类&#xff08;单例模式&#xff09; 1. 前言 在实际场景中&#xff0c;我们在编写类的过程中总会遇到一些特殊情况&#xff0c;比如设计一个类不…

[AutoSar]BSW_Com015 PDUR 模块配置

目录 关键词平台说明一、Abbreviations二、PduRBswModules三、PduRGeneration四、PduRDestPdus4.1 全局PDU ID和本地PDU ID 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语言C&#xff0…

[ThinkPHP]Arr返回1

$detailId (int)Arr::get($detail, null); var_dump($detailId); 打印结果&#xff1a;int(1) 原因&#xff1a; vendor/topthink/think-helper/src/helper/Arr.php

水泵房远程监控物联网系统

随着物联网技术的快速发展&#xff0c;越来越多的行业开始利用物联网技术实现设备的远程监控与管理。水泵房作为城市供水系统的重要组成部分&#xff0c;其运行状态的监控与管理至关重要。HiWoo Cloud作为专业的物联网云服务平台&#xff0c;为水泵房远程监控提供了高效、稳定、…

API--10-1--StringJoiner工具类

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 StringJoiner构造函数成员变量公开方法1.构造函数2. add() 添加字符串3. setEmptyValue 输出指定字符串 StringJoiner案例案例1案例2 StringJoiner StringJoiner是…

5 张图带你了解分布式事务 Saga 模式中的状态机

大家好&#xff0c;我是君哥。 状态机在我们的工作中应用非常广泛&#xff0c;今天聊一聊分布式事务中间件 Seata 中 Saga 模式的状态机。 1 状态机简介 状态机是一个数学模型&#xff0c;它将工作中的运行状态和流转规则抽象出来&#xff0c;可以协调相关信号来完成预先设定…

30.HarmonyOS App(JAVA)鸿蒙系统app多线程任务分发器

HarmonyOS App(JAVA)多线程任务分发器 打印时间&#xff0c;记录到编辑框textfield信息显示 同步分发&#xff0c;异步分发&#xff0c;异步延迟分发&#xff0c;分组任务分发&#xff0c;屏蔽任务分发&#xff0c;多次任务分发 参考代码注释 场景介绍 如果应用的业务逻辑比…

Docker进阶教程 - 1 Dockerfile

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 1 Dockerfile Dockerfile 是做什么的&#xff1f; 我们前面说到&#xff0c;制作镜像的方法主要有两种方式&#xff1a; 使用 docker commit 命令&#xff1b;使用 Dockerfile 文件。 但是…

C语言学习过程总结(16)——指针(4)

一、数组名的理解 我们直接使用%p打印出地址来看看&arr【0】 和 arr的不同&#xff1a; int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };printf("&arr[0] %p\n", &arr[0]);printf("arr %p\n", arr);} 、 很容易看出来两者的输出…

最强AI换脸工具Rope使用教程,Rope整合包下载【全网最全安装步骤】

Rope的汉化整合包&#xff08;包含模型&#xff09;以及下面教程所涉及到的所有安装包我都打包好了&#xff0c;需要的小伙伴可以关注文章底部公众号&#xff0c;回复关键词【rope】获取。 AI换脸软件简介必读 Rope 是一个免费开源的 AI 换脸软件&#xff0c;它具有图形化界面…

MySQL之旅

本文字数&#xff1a;11653&#xff1b;估计阅读时间&#xff1a;30 分钟 审校&#xff1a;庄晓东&#xff08;魏庄&#xff09; 本文在公众号【ClickHouseInc】首发 介绍 "简单是终级的精致。"- --列奥纳多达芬奇 虽然我们喜欢在 ClickHouse 为用户宣布新功能&#…

【代码】提取图像轮廓坐标并保存为YOLOv8所需的txt格式

该段代码的应用场景为对图像标注过后&#xff0c;想要对图像进行裁切&#xff0c;但是标签不能裁切&#xff0c;所以将原图像按照标签进行二值化后&#xff0c;将二值化后的图像进行裁切&#xff0c;然后使用opencv对裁切后的图像进行处理&#xff0c;识别出白色区域轮廓&#…

用c++实现计数排序、颜色排序问题

3.3.1 计数排序 【问题】 假设待排序记录均为整数且取自区间[0,k],计数排序(count sort)的基本思想是对每一个记录x&#xff0c;确定小于x的记录个数&#xff0c;然后直接将x放在应该的位置。例如&#xff0c;小于x的记录个数是10,则x就位于第11个位置。 【想法】 对于待排序序…

vulnhub-----SickOS靶机

文章目录 1.信息收集2.curl命令反弹shell提权利用POC 1.信息收集 ┌──(root㉿kali)-[~/kali/vulnhub/sockos] └─# arp-scan -l Interface: eth0, type: EN10MB, MAC: 00:0c:29:10:3c:9b, IPv4: 10.10.10.10 Starting arp-scan 1.9.8 with 256…

移动端研发技术的进化历程

移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来&#xff0c;一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台&#xff08;比如iOS或Android&#xff09;所特有的应用&#xff0c;使…

【C/C++】C语言开发者必读:迈向C++的高效编程之旅

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方…

《1w实盘and大盘基金预测 day5》

从周预测到每天的预测都非常准。 主要的问题&#xff0c;操作股票情绪起伏太大&#xff0c;对一些个股把握不准&#xff08;医疗乱我心&#xff09;&#xff0c;整体情况还是非常好的。得分A 本周行情展望&#xff08;基本得到验证&#xff09;&#xff1a; 大盘应该还是震荡…

章节2:单词本该这样记

为什么我们记不住单词&#xff1f; 单词不是被胡编乱造出来的&#xff0c;单词是有规律的&#xff0c;单词是符合人类的逻辑的。 单词实际意思结构意义历史文化 我们要怎么记单词&#xff1f; 掌握单词的结构规律了解与单词有关的历史文化灵活巧计&#xff0c;不要太拘泥于…

vue2+vant2+Laravel7 实现多图上传到七牛云

后端接口 1、路由&#xff0c;在 routes/api.php 中 Route::resource(photos, PhotoController)->only(store);2、创建对应控制器 <?php namespace App\Http\Controllers; use Illuminate\Http\Request;class PhotoController extends Controller {/**** 上传图片* p…

网络安全行业真的很内卷吗?

有一个特别流行的词语叫做“内卷”&#xff1a; 城市内卷太严重了&#xff0c;年轻人不好找工作&#xff1b;教育内卷&#xff1b;考研内卷&#xff1b;当然还有计算机行业内卷…… 这里的内卷当然不是这个词原本的意思&#xff0c;而是“过剩”“饱和”的替代词。 按照网络安…