树结构系列(二):平衡二叉树、AVL树、红黑树

本文详细介绍了平衡二叉树的概念,特别是AVL树和红黑树的特性与操作。AVL树是最早的自平衡二叉查找树,保证任意节点的两个子树高度差不超过1,而红黑树允许子树高度差大于1,通过牺牲部分查询效率提高插入和删除速度。文章讨论了两种树的旋转操作、插入与删除的策略,以及它们在不同场景下的应用和优缺点。
摘要由CSDN通过智能技术生成

文章首发于「陈树义」公众号及个人博客 shuyi.tech

前面说到二叉树在极端情况下会退化成链表,那如何解决这个问题呢?

答案是:树的平衡。我们通过树的平衡,使得左右子树的深度保持在较小范围内,从而保证二叉树的查询效率。 这就是平衡二叉树的核心思想。这种能平衡左右子树的二叉树,我们称之为平衡二叉树。

官方对于平衡树的定义是:任意节点的子树的高度差都小于等于 1。 常见的符合平衡树的有:2-3 树、B 树、AVL 树等。红黑树是一种特殊的自平衡树,其子树的高度差并不一定小于等于 1。AVL 树虽然查询效率高,但是插入、删除效率低,需要不断旋转以保持平衡。而红黑树通过牺牲一些查询效率,提高了插入、删除的效率。

AVL树

AVL 树是最早发明的自平衡二叉查找树。 在 AVL 树中任何节点的两个子树的高度最大差别为 1,所以它也被称为高度平衡树。 增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL 树得名于它的发明者 G. M. Adelson-Velsky 和 E. M. Landis,他们在 1962 年的论文《An algorithm for the organization of information》中发表了它。

AVL 树本质上还是一棵二叉搜索树,但是其比二叉搜索树还多了平衡功能。它的特点是:

  1. 本身首先是一棵二叉搜索树。

  2. 带有平衡条件:每个结点的左右子树的高度之差的绝对值(平衡因子)最多为 1。

也就是说,AVL 树本质上是带了平衡功能的二叉搜索树。

AVL 树的旋转操作,本质上和红黑树的类似,这里就不细讲。我们在下面讲解红黑树的时候再展开说。

红黑树

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构。红黑树是在 1972 年由 Rudolf Bayer 发明的,当时被称为平衡二叉 B 树(symmetric binary B-trees)。后来,在 1978 年被 Leo J. Guibas 和 Robert Sedgewick 修改为如今的「红黑树」。

红黑树是一种特化的 AVL 树(平衡二叉树),都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。

它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的:它可以在 O (log N) 时间内做查找、插入和删除,这里的 N 是树中元素的数目。

对于红黑树来说,其可能有如下一些特点:

  1. 若一棵二叉查找树是红黑树,则它的任一子树必为红黑树。

  2. 红黑树是一种平衡二叉查找树的变体,它的左右子树高差有可能大于 1。

  3. 与 AVL 树相比,其通过牺牲查询效率来提升插入、删除效率。

红黑树是在二叉查找树的基础上演化进来的,除了二叉查找树的要求之外,红黑树还具有如下五个强制要求(属性):

  • 性质 1. 结点是红色或黑色。

  • 性质 2. 根结点是黑色。

  • 性质 3. 所有叶子都是黑色。(叶子是 NIL 结点)。

  • 性质 4. 每个红色结点的两个子结点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色结点)。

  • 性质 5. 任意一节点到每个叶子节点的路径都包含数量相同的黑节点。

上面这 5 个性质使得红黑树有一个关键的性质:从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。 为何会有这样一个结果,其实从性质中我们就可以大概猜出一二。

性质 4 与性质 5 是红黑树关键的核心性质。 性质 4 表明一个节点到根节点的最短可能路径都是黑色节点,最长可能路径有交替红色和黑色节点。根据性质 5 所有最长的路径都有相同数目的黑色结点,这就表明了没有路径能多于任何其他路径的两倍长。

当我们在对红黑树进行插入和删除等操作时,对树做了修改,那么可能会违背红黑树的性质。为了保持红黑树的性质,我们可以对相关结点做一系列的调整,通过对树进行旋转(例如左旋和右旋操作),即修改树中某些结点的颜色及指针结构,以达到对红黑树进行插入、删除结点等操作时,红黑树依然能保持它特有的五个性质。

红黑树操作

本部分内容来自田小波的技术博客,地址:红黑树详细分析 | 田小波的技术博客

红黑树的基本操作和其他树形结构一样,一般都包括查找、插入、删除等操作。前面说到,红黑树是一种自平衡的二叉查找树,既然是二叉查找树的一种,那么查找过程和二叉查找树一样,比较简单,这里不再赘述。相对于查找操作,红黑树的插入和删除操作就要复杂的多。

尤其是删除操作,要处理的情况比较多,不过大家如果静下心来去看,会发现其实也没想的那么难。好了,废话就说到这,接下来步入正题吧。

旋转操作

在分析插入和删除操作前,这里需要插个队,先说明一下旋转操作,这个操作在后续操作中都会用得到。旋转操作分为左旋和右旋,左旋是将某个节点旋转为其右孩子的左孩子,而右旋是节点旋转为其左孩子的右孩子。这话听起来有点绕,所以还是请看下图:

上图包含了左旋和右旋的示意图,这里以右旋为例进行说明,右旋节点 M 的步骤如下:

  1. 将节点 M 的左孩子引用指向节点 E 的右孩子

  2. 将节点 E 的右孩子引用指向节点 M,完成旋转

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值