数据结构——笛卡尔树详解

ops/2024/10/23 14:00:03/

数据结构——>笛卡尔

    • 1,>笛卡尔的介绍
    • 2,>笛卡尔的构建
    • 3,>笛卡尔的代码实现

1,>笛卡尔的介绍

前面我们讲过《》和《>二叉搜索》,能不能把这两种数据结构的特性结合起来构造一棵新的呢?当然是可以的,这个就是我们这里要讲的>笛卡尔(Cartesian tree)。

>笛卡尔的每个节点有两个值 (x,y) ,其中一个满足>二叉搜索的特性,一个满足的特性,所以>笛卡尔是一棵具有>二叉搜索的两种特性的二叉

>笛卡尔中节点的两个值分别是数组中元素的值,和该元素在数组中的下标,其中元素的值满足的特性,元素的下标满足>二叉搜索的特性。

下面使用数组 [5, 6, 3, 8, 9, 1, 4, 7, 2] 构造一棵>笛卡尔

在这里插入图片描述

2,>笛卡尔的构建

因为元素的下标满足>二叉搜索的特性,而数组中元素的下标又是递增的,所以新插入的节点要么是根节点,要么是根节点右子上的某个节点,不可能是根节点左子上的某个节点

所以节点插入的时候不需要考虑左子,又由于元素的值满足的特性(这里我们选择最小),如果新插入的节点比根节点小,那么新节点就变成根节点的父节点,根节点就变成新节点的左子节点,如下图所示。

在这里插入图片描述

如果新节点的值比根节点大,那么新节点一定是根节点右子上的某个节点,根节点的右子节点可能很多,究竟插入到哪个位置呢?

实际上>笛卡尔的任何一棵子也都是>笛卡尔,那么右子当然也满足插入规则,如果新节点比根节点的右子节点小,那么根节点的右子节点是新节点的左子节点,新节点变成根节点的右子节点,如果新节点比根节点的右子节点大,继续和根节点右子节点的右子节点比较……

在这里插入图片描述

也就是说插入的时候新节点会和根节点一直往右的这条路径上的节点比较,为了方便比较我们可以使用一个栈来记录从根节点一直往右走的所有节点,很明显这个栈从栈顶到栈底是单调递减的,每次比较的时候不在从根节点开始,而是从栈顶元素开始比较,这个栈顶元素就是根节点一直往右走,最右边的节点。

在这里插入图片描述

这里我们选用最小,来看下>笛卡尔的构建步骤:

1,用数组中的第一个元素创建根节点,然后把根节点添加到栈中。
2,遍历数组的剩余元素,然后创建新节点和栈顶元素比较,如果栈不为空并且栈顶元素比新节点大,栈顶元素出栈。一直比较,直到栈为空或者栈顶元素小于新节点为止。
3,如果栈为空,让新节点变成根节点的父节点,根节点变成新节点的左子节点。
4,如果栈不为空,让最后一个出栈的节点变成新节点的左子节点,新节点变成栈顶元素的右子节点。
5,新节点入栈,继续重复步骤2,3,4,5,直到数组遍历完为止。

我们以数组 [5,6,3,8,9,1,4,7,2] 为例,来看下>笛卡尔的构建过程:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

3,>笛卡尔的代码实现


http://www.ppmy.cn/ops/127831.html

相关文章

离散制造和流程制造分别是什么?它们有什么区别?

为何有的企业生产过程看似一气呵成,而有的则是由多个环节组合而成?其实这就涉及到了制造业的两种常见生产模式。 流程制造离散制造 那么,在生产管理方面,离散制造和流程制造分别有什么特点、区别呢? 今天&#xff0…

Linux——应用软件的生命周期

功能开发测试: 功能性测试 对应开发框架的测试用例代码的漏洞扫描 Web服务器版本应用开发语言的依赖关系和版本信息是否会造成类似内存泄露等影响系统性能的问题压力测试应用的部署 获取应用代码以及应用静态文件的代码包将安装包中的文件按照服务器配置的架构&…

sql-labs靶场第十九关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①寻找注入方法 ②爆库,查看数据库名称 ③爆表,查看security库的所有表 ④爆列,查看users表的所有列 ⑤成功获取用户名…

webAPI中的offset、client、scroll

一、元素偏移量offset 1.offset概述 offset翻译成中文叫:偏移量,我们使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等等 获得元素距离带有定位父元素的位置获得元素自身的大小(宽度和高度&#xf…

Python 爬虫实战与技巧分享--urllib

Python 爬虫实战与技巧分享–urllib 在当今信息时代,数据的价值日益凸显。Python 爬虫作为一种强大的数据获取工具,能够帮助我们从互联网上抓取各种有价值的信息。本文将结合具体代码示例,深入探讨 Python 爬虫的相关知识和关键要点。 一、…

MyBatis 中updateByPrimaryKey和updateByPrimaryKeySelective区别

在 MyBatis 中,updateByPrimaryKey和updateByPrimaryKeySelective主要有以下区别: 一、功能 updateByPrimaryKey: 会根据传入的实体对象,将数据库表中对应主键的记录所有字段全部更新为实体对象中的值。即使实体对象中的某些字段…

数据分析题面试题系列2

一.如何估算星巴克一天的营业额 a.需求澄清:区域?节假日?产品范围? b.收入销售杯数*单价(营业时间*每小时产能*每小时产能利用率)*平均单价 Hypo该星巴克门店的营业时间为12小时(取整&#x…

vxe-table 导入导出功能全解析

一、vxe-table 导入导出功能概述 vxe-table 的导入导出功能在数据处理中具有至关重要的作用。在现代数据管理和处理的场景中,高效地导入和导出数据是提高工作效率的关键。 对于导入功能而言,它允许用户将外部的表格数据,如 Excel 文件&…