平衡树原理讲解

news2024/11/22 18:30:37

平衡树——Treap

文章目录

  • 平衡树——Treap
    • BST
    • 平衡树
      • 左旋、右旋`zag(o)、zig(o)`
        • 左旋
        • 右旋

BST

定义

  1. 空树是二叉搜索树。

  2. 若二叉搜索树的左子树不为空,则其左子树上所有点的附加权值均小于其根节点的值。

  3. 若二叉搜索树的右子树不为空,则其右子树上所有点的附加权值均大于其根节点的值。

  4. 二叉搜索树的左右子树均为二叉搜索树。

性质

二叉搜索树的中序遍历是一个有序序列

操作

插入insert(o, v)

  1. o o o 为空,直接返回一个值为 v v v 的新节点。

  2. o o o 的权值等于 v v v,该节点的附加域该值出现的次数自增 1 1 1

  3. o o o 的权值大于 v v v,在 o o o 的左子树中插入权值为 v v v 的节点。

  4. o o o 的权值小于 v v v,在 o o o 的右子树中插入权值为 v v v 的节点。

删除del(o, v)

先在二叉搜索树中找到权值为 v 的节点,分类讨论如下:

  1. 若该节点的附加 cnt \textit{cnt} cnt 大于 1 1 1,只需要减少 cnt \textit{cnt} cnt

  2. 若该节点的附加 cnt \textit{cnt} cnt 1 1 1

    • o o o 为叶子节点,直接删除该节点即可。

    • o o o 为链节点,即只有一个儿子的节点,返回这个儿子。

    • o o o 有两个非空子节点,一般是用它左子树的最大值或右子树的最小值代替它,然后将它删除。

找前驱 / 后继get_prev(o)、get_next(o)

前(后)驱表示中序遍历中前(后)一个位置,以前驱为例

  1. 存在左子树,则找到左子树中最右边的元素,并返回。
  2. 不存在左子树,找第一个祖先节点中节点 o o o位于其右子树中,返回这个祖先节点

查找最大 / 最小值get_min(o)、get_max(o)

由二叉搜索树的性质可得,二叉搜索树上的最小值为二叉搜索树左链的顶点,最大值为二叉搜索树右链的顶点。

求元素排名get_rank(o)

排名定义为将数组元素排序后第一个相同元素之前的数的个数加一

查找一个元素的排名,首先从根节点跳到这个元素,若向右跳,答案加上左儿子节点个数加当前节点重复的数个数,最后答案加上终点的左儿子子树大小加一。

查找排名为 k k k的元素get_value_by_rank

在一棵子树中,根节点的排名取决于其左子树的大小。

若其左子树的大小大于等于 k k k,则该元素在左子树中;

若其左子树的大小在区间 [ k − cnt , k − 1 ] [k-\textit{cnt},k-1] [kcnt,k1] cnt \textit{cnt} cnt 为当前结点的值的出现次数)中,则该元素为子树的根节点;

若其左子树的大小小于 k − cnt k-\textit{cnt} kcnt,则该元素在右子树中。

平衡树

对于一般的二叉搜索树,有可能退化为链表。想象一棵每个结点只有右孩子的二叉搜索树,那么它的性质就和链表一样,插入与查找时间都是 O ( n ) O(n) O(n)
二叉搜索树的「平衡」概念是指:每一个结点的左子树和右子树高度差最多为 1。

可以对不满足平衡条件的二叉搜索树进行调整,使不平衡的二叉搜索树变得平衡。

调整要保证的标准还有二叉搜索树先天自带的条件:二叉搜索树,按照中序遍历,得到从小到大的结点值序列。对于任意一个结点,左子树各结点的最大值,小于该结点的值;该结点的值,小于右子树各结点的最小值。只有保证这一点才能称为一个二叉搜索树。

左旋、右旋zag(o)、zig(o)

左旋

左旋,左旋也称为「左单旋转」或「RR 平衡旋转」。对于结点 A A A 的左旋操作是指:将 A A A 的右孩子 B B B 向左上旋转,代替 A A A 成为根节点,将 A A A 结点向左下旋转成为 B B B 的左子树的根结点, B B B 的原来的左子树变为 A A A 的右子树。

右旋

右旋,右旋也称为「右单旋转」或「LL 平衡旋转」。对于结点 A A A 的右旋操作是指:将 A A A 的左孩子 B B B 向右上旋转,代替 A A A 成为根节点,将 A A A 结点向右下旋转成为 B B B 的右子树的根结点, B B B 的原来的右子树变为 A A A 的左子树。

在这里插入图片描述

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

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

相关文章

Vue路由(vue-router)详细讲解指南

Vue Router 是 Vue.js 官方的路由管理器。它和 Vue.js 的核心深度集成,让构建单页面应用变得易如反掌。路由实际上就是可以理解为指向,就是我在页面上点击一个按钮需要跳转到对应的页面,这就是路由跳转; 首先我们来学习三个单词&…

运维小白必学篇之基础篇第八集:LVM实验

LVM实验 实验一: 使用/dev/sdb磁盘完成以下操作: 1、创建5个物理卷,组成大小为10G的卷组vgtest 2、创建大小为3G的逻辑卷lv1,格式化xfs文件系统,实现开机自动挂载 3、为lv1逻辑卷扩容至5G,然后查看扩容之…

男子路遇“纸片鸟”,AI帮忙免惹祸

据报道,近日,河南洛阳一网友在路边偶遇一只“纸片鸟”,小鸟远看像一张纸片,样子十分奇特,而且还死死地盯着自己,像是求救,后来他用手机一查发现是二级保护动物“黄斑苇鳽”,便报警处…

排水管网监测预警系统:为城市排水建设提质增效

最近,城市生命线安全工程占据着行业的头条榜单,与民众生活密不可分的城市基础设施,包括城市的燃气、桥梁、供水、排水、供热、综合管廊等被称为城市生命线。城市生命线安全工程是城市更新和新型城市基础设施建设的重要内容,其主要…

数说故事×中广协丨广告代言人内容商业沙龙走进大湾区

以“娱时俱进,内容赋能”为主题的广告代言人内容商业沙龙(大湾区站),近日在广州市白云区美湾广场成功举行。 沙龙由中国广告协会作为指导单位,广东省广告协会与中国广告协会广告代言人工作委员会联合主办,广…

机器视觉陶瓷板外观缺陷检测系统应用

随着科技的不断发展,机器视觉技术在工业领域的应用越来越广泛。其中,机器视觉陶瓷板外观缺陷检测系统是一项十分重要的技术。该系统利用计算机视觉技术对陶瓷板表面的缺陷进行自动化检测,大大提高了生产效率和产品质量。 机器视觉陶瓷板外观…

智能应用搭建平台——LCHub低代码表单 vs 流程表单 vs 仪表盘

1. LCHub低代码如何选择 「流程表单」:填报数据,并带有流程审批功能,适合报销、请假申请或其他工作流; 「表单」:填报数据,并带有数据协作功能,如修改、删除、导入、导出,并可以给不同的人不同的管理权限; 「仪表盘」:数据分析处理、结果展示功能,如数据汇总、趋…

如何实现Web3去中心化云计算的大规模采用?

随着区块链技术的迅猛发展,Web3去中心化云计算正在逐渐崭露头角。它以分布式、安全和透明的特点,为用户和企业提供了许多独特的优势。 然而,要实现Web3去中心化云计算的大规模采用,仍然面临着一些挑战。本文将探讨这些挑战&#x…

[EuroSys2023 Best Poster] 面向动态图的极低时延GNN推理采样服务

作者:沈雯婷 GraphLearn是阿里云机器学习平台PAI 团队和达摩院智能计算实验室图计算团队共建的工业界大规模图神经网络训练框架, 也是一站式图计算平台GraphScope的图学习引擎。GraphLearn最新开源了面向动态图的GNN在线推理实时采样服务(DGS)。DGS具备处理实时高吞…

端口占用解决报错:Web server failed to start. Port 8080 was already in use.

报错信息如下: Description: Web server failed to start.Port 8080 was already in use. Action: Identify and stop the process thats listening on port 8080 or configure this application to listen on another port. 当idea项目启动时报这个错,意思是端…

2019年一月联考逻辑真题

2019年一月联考逻辑真题 三、逻辑推理:第 26~55 小题,每小题 2 分,共 60 分。下列每题给出的 A、B、C、D、 E 五个选项中,只有一项是符合试题要求的。请在答题卡上将所选项的字母涂黑。 真题(2019-26&#…

【数据结构】虽然很难很抽象,但是你还是得努力弄懂的数据结构——链表,基本上你每一段代码都可能会用到

链表解决了顺序表插入或删除元素麻烦的问题,链表的存储结构是用一组任意的存储单元来存放线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。 对每个数据元素ai,除了存储其本身的信息之外,还需存储一个指…

【Vue】详解Vue生命周期

Vue实例的生命周期全过程(图) (这里的红边圆角矩形内的都是对应的Vue实例的钩子函数) 在beforeCreate和created钩子函数间的生命周期 在beforeCreate和created之间,进行数据观测(data observer) ,也就是在这…

港联证券投资前瞻:新能源汽车再迎助力 科技巨头持续加注机器人领域

上周五,A股主要股指全线走高,沪指涨近1%,上证50指数涨近2%。截至收盘,沪指涨0.79%报3230.07点,深成指涨1.5%报10998.08点,创业板指涨1.22%报2233.27点,上证50指数涨1.73%;两市合计成…

圆梦,终于进阿里了,分享面试题

前面我说过:能去大厂就去大厂,有机会就去争取,年纪轻轻的,多努力就完事了。 总有黑粉怼我:进大厂哪有你说的那么简单,呵呵…… 我笑而不语,你自己都不相信自己,还怎么进&#xff1…

在 Python 中为对象添加属性

我们将介绍如何在 Python 中为对象添加属性。 我们还将通过示例介绍如何在 Python 中更改对象的属性。 在 Python 中为对象添加属性 在 Python 中,我们时常使用对象,因为 Python 是一种面向对象的语言。 对象使我们的代码可重用并易于实现复杂的结构。 …

《MySQL(二):基础篇- SQL》

文章目录 2. SQL2.1 SQL通用语法2.2 SQL分类2.3 DDL2.3.1 数据库操作2.3.2 表操作2.3.2.1 表操作-查询创建2.3.2.2 表操作-数据类型2.3.2.3 表操作-案例2.3.2.4 表操作-修改2.3.2.5 表操作-删除 2.4 图形化界面工具2.4.1 安装2.4.2 使用 2.5 DML2.5.1 添加数据2.5.2 修改数据2.…

MySQL数据同步到ES的4种解决方案

一、背景 大家应该都在各种电商网站检索过商品,检索商品一般都是通过什么实现呢?搜索引擎Elasticsearch。那么问题来了,商品上架,数据一般写入到MySQL的数据库中,那么用于检索的数据又是怎么同步到Elasticsearch的呢&…

[2.0快速体验]Apache Doris 2.0 弹性计算节点快速体验

​1. 概览 我们都知道Doris 目前是一个典型的Share-Nothing的架构,Doris 通过绑定数据和计算资源在同一个节点获得非常好的性能表现. 但随着Doris 计算引擎性能持续提高, 越来越多的用户也开始选择使用Doris直接查询数据湖数据. 这类场景是一种Share-Disk场景, 数据…

Vue.js 中的模板编译原理是什么?

Vue.js 中的模板编译原理是什么? Vue.js是一种流行的前端框架,它使用了一种称为“模板”的技术来实现视图的渲染和更新。在Vue.js中,模板是一种类似HTML的语言,用于描述视图的结构和内容。但是,Vue.js并不直接将模板转…