Python - 深夜数据结构与算法之 AVL 树 & 红黑树

这篇具有很好参考价值的文章主要介绍了Python - 深夜数据结构与算法之 AVL 树 & 红黑树。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

目录

一.引言

二.高级树的简介

1.树

2.二叉树

3.二叉搜索树

4.平衡二叉树

三.AVL 树

◆ 插入节点

◆ 左旋

◆ 右旋

◆ 左右旋

◆ 右左旋

◆ 一般形式

◆ 实际操作

◆ 总结

四.红黑树

◆ 概念

◆ 示例

◆ 对比

五.总结


一.引言

前面我们介绍了二叉树、二叉搜索树、多叉树等基础的树形结构,本文扩展一些新的树类型,例如 AVL 树、红黑树、B 树等等,完善一下整个框架内树的的概念。

二.高级树的简介

1.树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

树,这里就不多重复了,包括根节点、左右子节点,分为多个层级的扩散的结构,因为其树形的结构天然的适合使用递归的方法进行遍历与处理。

2.二叉树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

只有左右分叉的树即为二叉树, 二叉树主要掌握其三种遍历方式。

- 前序 Pre-order 根-左-右

- 中序 In-Order 左-根-右

- 后序 Post-Order 左-右-根

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

3.二叉搜索树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

通过对数据进行有序编排,二叉搜索树将 o(n) 的搜索复杂度缩减为 o(log2n),其特点:

左子树所有节点小于根节点

右子树所有节点大于根节点

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

需要注意,二叉搜索树的中序遍历是升序排列。 

◆ 节点查找

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

只需要与根节点比较即可,小于根节点到左子树,大于2根节点到右子树。 可以看到其查询的时间复杂度就是树的深度即 Level。

◆ 极端情况

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

当我们构建二叉搜索树时不注意树的结构或者平衡时,其容易出现如上图所示的极端情况,此时二叉树退化为链表,其搜索复杂度也恢复至 o(n)。

4.平衡二叉树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

上面这种情况,最简单的平衡方法就是从中间把棍子打断,然后对于左右的棍子依次打断,直到平衡,但是实际情况下我们不会等树发展到这种棍子的状态才进行调整,我们一般在每一步插入元素的时候都会查看当前树是否平衡,并对其进行平衡化的操作。下面我们就了解几种常见的平衡二叉树。

三.AVL 树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

AVL 树命名来源于其发明者,其在树中引入了平衡因子即 Balance Factor,该因子的计算为 左子树高度 - 右子树高度 或者 右子树高度 - 左子树高度,因此其值的范围控制在 -1、0、1。这里是高度而不是节点数的原因是二叉树的搜索时间复杂度与其深度即 Level 有关,而不是节点个数 (考虑棍子的极端情况)。当检测到数非平衡时,其会通过四种旋转操作使树达到平衡。

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

以上面的二叉树为例,每一个节点的平衡因子都基于其左右子树的深度差计算,以 J 为例,右子树深度即 Level 为 4,而左子树的深度为 3,从而其值 = 4 - 3 = 1。 而所有叶子节点左右子树都为 0,所以其值为 0。上面这个树的平衡因子范围在 [-1, 1],因而其是一颗严格意义上平衡的AVL 树,因此保持一个树的平衡因子在 [-1,1] 范围内,其就是一颗平衡二叉搜索树。

◆ 插入节点

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

14 增加后平衡因子在 [-1,1] 范围内,因此无需调整。 

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

3 增加后根节点与第一个左节点的平衡因子变为 -2,此时平衡树被打破,需要使用旋转操作进行 reblance,共有四种旋转方式:

◆ 左旋

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

右右子树的情况,需要进行一次左旋调整为 AVL树。 A < B < C,所以 A B C 有效。

◆ 右旋

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

左左子树的情况下,依次右旋调整为 AVL 树。 A > B > C,所以 C B A 有效。

◆ 左右旋

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

左右子树即先一个单独左,再一个单独右,此时满足 A > B && C > B && A > C,结合在一起就是 A > C > B,所以可以先左旋 BC 并调换位置调整为 A > C > B 的左左子树,再右旋得到 B C A。

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

  

◆ 右左旋

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

B > A,B > C,C > A => B > C > A,所以可以切换为右右子树 A C B,再一次左旋即可。 

◆ 一般形式

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

上面介绍了单节点的四种旋转方式,实际场景带子树的情况比较多,上面是几种通用的旋转方法。 我们再从头捋一遍 AVL 树,首先树的查询是基于其深度 Level 来的,所以通过引入平衡因子就能够获得高度差从而衡量一个树是否平衡,当超过1不平衡时,我们可以通过旋转进行 rebalance,此时从单节点推广至多节点,AVL 树的情况大致就这样。

◆ 实际操作

下面基于真实的二叉搜索树进行旋转操作。

- 左左子树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

红框所在部分为左左子树,根据一般形式,我们需要把 Pivot = 5 提上去,再把 10 放下来,同时 Pivot 的 Right 挂到 root = 10 的  Left,就得到下面的结果,没理解的同学看一般形式再对应一下:

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

- 右左子树

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

红框部分为右左子树,参考上面一般方法, 进行右左旋,先将 15 换到 16,再把 16 改为 15.right,最后把 15 拿上去,9 改为 15.left 即可。

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

◆ 总结

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

AVL 树在满足平衡二叉搜索的情况下,每个 Node 都多余存储了一个平衡节点,因此其会有额外的存储负担,其次对于节点的增删,很容易使其成为非平衡的状态,从而频繁引发调整。 

四.红黑树

◆ 概念

上面的 AVL 树通过平衡因子维持整个搜索树的平衡,但是由于其因子范围太小 [-1,1] 导致这里调整的频率太高,从而影响了查询的效率,所以为了折中就推出了一些近似平衡二叉树,红黑树就是其中的代表。其允许左右子树之间的高度差在两倍以内,放宽了范围从而较少了调整的次数。

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

◆ 示例

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

上面提到五条性质,前三条比较 common,主要看后两条:

- 不能有相临接的两个红色节点

- 任一节点到其每个叶子的所有路径都包含相同数目的黑色节点 

Most Important:

从根到叶子的最长的可能路径不多于最短路径的两倍长。

◆ 对比

Python - 深夜数据结构与算法之 AVL 树 & 红黑树,夜深人静写算法,Python,数据结构,AVL 树,红黑树

- AVL 树相比红黑树提供更快的查询效率,因为其更严格的平衡

- 红黑树提供了更快的插入和移除效率,因为 AVL 涉及到过多的旋转调整

- AVL 存储更多,因为其需要 int 存储节点平衡度,而红黑树只需要 bit 存储红或蓝即 0 或 1 

- 读多写少适合使用 AVL 树,而工程中二者兼顾,所以红黑树的使用更加普遍例如 map/multimap

五.总结

截止到目前,一些基础的搜索结构与算法我们也了解差不多了,从最基本的树形结构,到并查集、Trie 树、二叉树、完全二叉树、平衡树等等。由于 AVL 树和红黑树的实现相对复杂,所以我们主要掌握其思想以及对应的几种旋转操作即可,做到能够看懂说清。文章来源地址https://www.toymoban.com/news/detail-804873.html

到了这里,关于Python - 深夜数据结构与算法之 AVL 树 & 红黑树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【高阶数据结构】红黑树 {概念及性质;红黑树的结构;红黑树的实现;红黑树插入操作详细解释;红黑树的验证}

    红黑树(Red Black Tree) 是一种自平衡二叉查找树,在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。 AVL树 VS 红黑树 红黑树是

    2024年02月09日
    浏览(39)
  • Python - 深夜数据结构与算法之 位运算

    目录 一.引言 二.位运算简介 1.二进制与十进制 2.左/右移 3.位运算 4.异或 XOR 5.指定位置的位运算 6.实战要点 三.经典算法实战 1.Number-1-of-bits [191] 2.Power-Of-Two [231] 3.Reverse-2-Bits [190] 4.N-Queens [51] 四.总结 通常情况下我们计数采取十进制,这是因为日常生活中我们习惯了 0-9 的数字

    2024年01月18日
    浏览(33)
  • [数据结构]-红黑树

    前言 作者 : 小蜗牛向前冲 名言: 我可以接受失败,但我不能接受放弃   如果觉的博主的文章还不错的话,还请 点赞,收藏,关注👀支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、红黑树的基本知识  1、红黑树的概念 2、性质  二、红黑树的模拟实

    2024年02月04日
    浏览(36)
  • 红黑树数据结构

    现在JAVASE中HashMap中底层源码是由数组+链表+红黑树进行设计的,然后很多地方也是用到红黑树,这里单独对红黑树数据结构进行简单的介绍。 目录 红黑树概念 红黑树的性质 自平衡规则 代码   红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可

    2024年02月01日
    浏览(30)
  • 数据结构 | 红黑树

    节点的左边比节点的值小,右边比节点的值大。 节点要么是 红色 ,要么是 黑色 根节点 是黑色 叶子节点都是黑色的空节点 红黑树中红色节点的子节点都是黑色 从任一节点到叶子节点的所有路径都包含相同数目的黑色节点 在添加或者删除节点的时候,如果不满足这些性质会

    2024年01月21日
    浏览(32)
  • 数据结构——红黑树

    目录 概念 性质 结点的定义  插入 调整 当p是g的左孩子时 当p为g的右孩子时 插入完整代码 红黑树的检测 红黑树完整代码(包括测试数据)   红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是RED或BLACK。 通过对任何一条从根到叶子的路径

    2023年04月09日
    浏览(35)
  • 【数据结构】红黑树

    🐱作者:一只大喵咪1201 🐱专栏:《数据结构与算法》 🔥格言: 你只管努力,剩下的交给时间! 在学习AVL树的时候,我们知道,当修改AVL树的结构(插入,删除)时,会通过旋转来保证平衡因子不超过1,所以频繁的修改结构会导致效率低下,今天我们学习的红黑树就完美解

    2023年04月17日
    浏览(37)
  • 【数据结构-树】红黑树

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月07日
    浏览(36)
  • C++数据结构--红黑树

    红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路 径会比其他路径长出俩倍,因而是接近平衡的。如图所示: 每个结点不是红色就是黑色。

    2024年02月09日
    浏览(35)
  • 数据结构--红黑树详解

    红黑树(Red Black Tree)是一种自平衡二叉查找树。它是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的“红黑树”。 由于其自平衡的特性,保证了最坏情形下在 O(logn) 时间复杂度内完

    2024年02月22日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包