C语言实现笛卡尔树

news2025/4/9 18:03:47

先来回顾一下笛卡尔树的性质:笛卡尔树是这样一个二叉树,它能保持原序列的先后顺序,并且具备堆的性质。这里假设序列中无相等元素。

假设有一个序列{9,3,7,1,8,12,10,20,15,18,5},以此序列来建立一个笛卡尔树,则建好后的二叉树,中序访问该二叉树仍会得到原来的序列{9,3,7,1,8,12,10,20,15,18,5},且该二叉树还是一个堆(大根堆或小根堆)。以小根堆为例,则建成的笛卡尔树如图所示:

图源自维基百科

来说一下根据指定序列,建立笛卡尔树的思路:

因为新加入的节点在顺序上排在后面,所以只能在树的“右链”中寻找新节点应该插入的位置。(对右链操作的详细解释,可以看https://oi-wiki.org/ds/cartesian-tree/)那么怎么找到合适的位置?最简单的情况:新的节点的值大于右链中的叶子节点(设右链有k个节点),将新节点直接接到右链的右端,作为右链新的叶子节点即可,因为,加入该节点后,并没有破坏原来小根堆的性质。

更为复杂的情况:新的节点的值要比右链中的值新的节点的值()

中的至少一个值小。那么,我们需要找到在右链中的合适位置,使得

此时,为了保持小根堆的性质,我们需要在原先节点的位置插入新节点,另成为的右子树,原先节点则成为新节点的左子树。这样,既保证了小根堆的性质,又使新节点永远是右链中最末端(叶子)节点。

还有一种特殊情况,即

此时新节点成为根节点,移动到的左子树。即右链只有一个节点。

观察整个插入过程,只会牵扯到右链中的节点,非右链节点不会变动位置。每次从右链的末端到根部进行遍历,找到合适的位置插入新节点,并把值更大的节点调整到新节点的左子树中。

可以用一个栈来保存右链信息。每次插入新节点,从栈顶一个个比较,比新节点值大的节点弹出,直到找到合适位置。弹出的最后一个节点作为新节点的左子树。新节点作为栈中上一个节点(如果有)的右子树。

代码如下所示。此处用数组来实现的栈,并没有真的做弹出操作,而只是更新了栈顶元素的位置,记录栈顶元素下标的变量top- - 即模拟栈弹出操作。

完成笛卡尔树的遍历后,中序遍历该树,仍保持原序列顺序。

代码如下所示:

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

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

相关文章

GitLab入门

极狐GitLab gitlab实现⾃动部署的原理1、部署机上,需要安装插件 gitlab-runner2、部署机安装 gitlab-runner之后,向gitlab服务器注册3、gitlab服务器收到commit事件之后,通知部署机拉取代码,执⾏部署。4、部署机执⾏什么操作&…

pytorch和numpy的互相转换、数学计算公式

格式转换 使用torch.from_numpy() 将numpy的array转化为torch的张量。 结果如下: 而把张量转为numpy的数组:tensor2array torch_data.numpy() 计算绝对值 torch.abs() data [-1,-2,1,2] tensor torch.FloatTensor(data) …

HoloLens2 Visible-Light Tracking Camera (VLC) 内参获取

HoloLens2 Visible-Light Tracking Camera(VLC)内参获取问题描述求解方法总结参考链接问题描述 OpenCV中的许多功能都需要输入相机内参(Camera Intrinsics)。然而,HoloLens2并没有提供直接获取相机内参的API,what is provided is …

初阶指针(详细版)

目录 一、指针是什么 1、内存 2、内存的管理与使用 3、指针变量的使用 二、指针和指针类型 1、指针类型的意义 2、指针 或 - 整数 3、指针解引用 三、野指针 1、野指针成因 2、如何规避野指针 四、指针运算 1、指针-整数 2、指针 - 指针 指针 - 指针的运用…

11_6、Java集合之Map接口(包括HashMap在内的子接口)的使用

一、引入Map与Collection并列存在。用于保存具有映射关系的数据:key-value (双列集合框架),Map 中的 key 和 value 都可以是任何引用类型的数据 。Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应 的类&…

Android Studio生成自己的so库

一、创建Native项目 1、新建 Native 项目 1)新建项目 选择最下面的 Native C 下一步即可 2)填写项目信息 3)选择C版本可以直接选择默认 2、下载并配置NDK及CMake 1)进入Studio 设置 SDK 设置界面 这里选择需要的 NDK 和 CMake…

c++之 OpenGL(1)-安装与概述

目录概述fedora下安装编写OpenGL应用程序测试hello,world概述 OpenGL(英语:Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于…

Linux开发工具的使用(一)

文章目录Linux开发工具的使用(一)1. Linux软件包管理器yum1.1 查看软件1.2 下载软件1.3 卸载软件2.vim编辑器的介绍和使用2.1 vim的介绍2.2 vim的基本操作2.3 vim命令模式命令集(必须是命令模式下)2.3.1 移动光标2.3.2 删除文字2.3.3 复制文本内容2.3.4 …

C++ 不知树系列之二叉堆排序(递归和非递归实现上沉、下沉算法)

1. 前言 什么是二叉堆? 二叉堆是有序的 完全二叉树,在完全二叉树的基础上,二叉堆 提供了有序性特征: 二叉堆 的根结点上的值是整个堆中的最小值或最大值。 当根结点上的值是整个堆结构中的最小值时,此堆称为最小堆。…

xpath获取标签之间的文本内容

目前在学习xpath,需要取一个package信息,如图: 标题 "package"在span里面,比较方便取,用这个xpath就行: //div[idartikeltabelle]/table/tbody/tr[1]/td[2]/span[classinsertlabela and text()pa…

/mmcv/_ext.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c107Warning

报/mmcv/_ext.cpython-36m-x86_64-linux-gnu.so: undefined symbol: _ZN3c107Warning 就是mmcv或者mmcv-full编译有问题; 尝试了mmcv_full-1.7.1-cp36-cp36m-manylinux1_x86_64.whl pip 安装,都不是对应版本; 在安装mmcv或者mmcv-full都是无…

如何用PPT画出好看的科研图

前言 好看的科研图可以从前人的作品中进行借鉴,今天介绍2副精美的科研图以及他们在PPT中的绘制方法,话不多说,先摆上标准科研图 1. 黑色粗体边框以及淡填充颜色 黑色粗体边框和淡填充颜色真的让矩形一下子变得很有质感,在学习的…

VMware Fusion设置静态IP+端口转发(macOS)+内网穿透

很少有资料提到配置macOS上VMware Fusion的端口转发,因此我在这里进行了一些记录打开网络设置解锁并添加新的网络适配器只有新的网络适配器才允许配置转发,默认的不允许这样做。设置NAT转发虚拟机选择使用新创建的虚拟网络适配器Ubuntu配置静态IP/DNS服务…

linux xshell用户免密登录设置

最重要准备工作 ​编辑linux xshell用户免密登录设置步骤 1.在xshel进行密钥获取操作 2.创建mkdir ~/.ssh目录(检查有没有这个目录,没有自己添加) 3.在该目录创建authorized_keys目录。注意(目录权限为600) 4.将刚…

Android Studio arctic Fox(北极狐)导入openCV

Android studio arctic Fox在引入opencv的时候按照正常的File->New->Import Module操作时,出现无法点击“Next”和“Finish”的情况。如下图 所以我们使用另外的方法进行引入。 准备工作: 1,Android Studio 2,下载opencv…

纪念2022年11月软考高项(信息系统项目管理师)一次通过的经验随笔

一、备考背景2022年5月的浙江软考因为疫情防控原因临时取消,我离杭州买房又远了几分。众所周知,杭州是炒房投资客的香饽饽,即使主城区购房摇号制度不停打补丁,也难济于事。自住客为了与投资客抗衡,一靠社保&#xff0c…

新品做软文推广发布在哪些平台好?

新产品上市前后,会经历开发期、介绍期、成长期、成熟期、衰退期五个阶段,每个阶段都需要软文推广的助力! 当一款新品上市前后往往会面临着无法打开市场、产品卖不出去等问题,这个时候软文推广就要做到位,除了文章撰写…

在centos7安装KubeSphere

节点准备 设置hostname hostnamectl set-hostname ks-m4 关闭防火墙 启动: systemctl start firewalld 关闭: systemctl stop firewalld 查看状态: systemctl status firewalld 开机禁用 : systemctl disable firewalld 开机…

SAP 通过 OData Service 反查 CDS View 位置 视图「Workaround」

前言 使用场景:目前已知 OData Service 由 CDS View 发布,但是想要查看该 CDS 的具体内容 根据 OData Service 获取关键信息盲猜对应底表通过 SE11 反查引用位置 猜底表 目前已知 OData Service URL: http://xxx.xxx.com:xxxx/sap/opu/odata/sap/ZCD…

栉风沐雨砥砺行,春华秋实满庭芳——华秋电子2022年度大事记

岁序更替,春华秋实 转眼间,2022年已是过去 回首2022年,华秋肩负使命 持续为电子产业增效降本。 我们加大研发投入,提升全球交付保障能力; 我们以创新引领发展,以实干笃定前行; 以品质为基…