红黑树详解及其模板类实现

红黑树是一种自平衡二叉搜索树,它在每次插入或删除操作后,通过重平衡确保树的高度保持在O(logn)。本文详细介绍了红黑树的历史、定义、平衡性,以及节点插入和删除的算法实现。红黑树因其高效的插入和删除操作,广泛应用于数据结构和算法中,如Java8的HashMap。
摘要由CSDN通过智能技术生成

一、历史

1972年,Rudolf Bayer发明了一种数据结构,这是一种特殊的4阶B树。这些树维护从根到叶的所有路径保持相同数量的节点,从而创建完美平衡的树。但是,它们不是二叉搜索树。Bayer在他的论文中将它们称为“对称二叉B树”(symmetric binary B-tree),后来它们作为2-4树(也称2-3-4树)变得流行。

在1978年的一篇论文“平衡树的二色框架”中,Leonidas J. Guibas和Robert Sedgewick从对称二叉B树中得到了红黑树。选择颜色“红色”是因为红色是在施乐PARC工作时作者可用的彩色激光打印机产生的最佳颜色。 Guibas的另一个说法是,由于可以使用红色和黑色的笔来绘制树。

1993年,Arne Andersson引入了右倾树 right leaning tree)的概念(AA树),以简化插入和删除操作。

1999年,Chris Okasaki展示了如何使插入操作纯粹起作用。它的平衡功能只需要处理4个不平衡情况和一个默认平衡情况。

最初的算法使用了8个不平衡的情况,但Cormen等人(2001)减少到6个不平衡的情况。Sedgewick展示了仅在46行Java代码中实现插入操作。2008年,Sedgewick提出了左倾红黑树(left-leaning red–black tree),利用了Arne Andersson的简化算法。Sedgewick最初允许树节点的两个孩子都是红色的节点,使该树更像2-3-4树,但后来增加了限制,使新树更像2-3树。Sedgewick仅在33行中实现了插入算法,大大缩短了他原来的46行代码。

二、概述

平衡二叉搜索树的形式多样,且各具特色。比如,伸展树实现简便、无需修改节点结构、分摊复杂度低,但可惜最坏情况下的单次操作需要\Omega(n)时间,故难以适用于核电站、医院等对可靠性和稳定性要求极高的场合。反之,AVL树尽管可以保证最坏情况下的单次操作速度,但需在节点中嵌入平衡因子等标识;更重要的是,删除操作之后的重平衡可能需做多达\Omega(logn)次旋转,从而频繁地导致全树整体拓扑结构的大幅度变化。

红黑树即是针对后一不足的改进。通过为节点指定颜色,并巧妙地动态调整,红黑树可保证:在每次插入或删除操作之后的重平衡过程中,全树拓扑结构的更新仅涉及常数个节点。尽管最坏情况下需对多达\Omega(logn)个节点重染色,但就分摊意义而言仅为O(1)个。当然,为此首先需要在AVL树“适度平衡”标准的基础上,进一步放宽条件。实际上,红黑树所采用的“适度平衡”标准,可大致表述为:任一节点左、右子树的高度,相差不得超过两倍

1.定义

为便于对红黑树的理解、实现与分析,统一地引入n+1个外部节点,以保证原树中每一节点的左、右孩子均非空----尽管有可能其中之一甚至二者同时是外部节点。当然,这些外部节点的引入只是假想式的,在具体实现时并不需要兑现为真实的节点。【但是如果外部节点确实是显式节点,它简化了一些在红黑树上操作的算法。为了节省执行时间,有时指向单个哨兵节点(sentinel node)(而不是空指针)的指针执行所有叶节点的角色; 然后从内部节点到外部节点的所有引用指向该哨兵节点。】如此扩展之后的便利之处在于,我们的考察范围只需覆盖真二叉树。

由红、黑两色节点组成的二叉搜索树若满足以下条件,即为红黑树(red-black tree):

  1. 树根始终为黑色
  2. 外部节点均为黑色
  3. 其余节点若为红色,则其孩子节点必为黑色
  4. 从任一外部节点到根节点的沿途,黑节点的数目相等

其中,条件1和2意味着红节点均为内部节点,且其父节点及左、右孩子必然存在。条件3意味着红节点之父必为黑色,因此树中任一通路都不包含相邻的红节点。除去根节点本身,沿途所经黑节点的总数称作该节点的黑深度(black depth)----根节点的黑深度为0。故条件4亦可等效地理解和描述为“所有外部节点的黑深度统一”。由条件4可进一步推知,在从任一节点通往其任一后代外部节点的沿途,黑节点的总数亦必相等。除去(黑色)外部节点,沿途所经黑节点的总数称作该节点的黑高度(black height)。所有外部节点的黑高度均为0。

可总结为:树根和外部节点为黑,红孩儿黑,所有外部节点的黑深度统一。

2.类比4阶B树

红黑树的上述定义,不免令人困惑和费解。幸运的是,借助B树的概念,我们完全可以清晰地理解和把握红黑树的定义,及其运转过程。为此,需要注意到:在红黑树4阶B树之间,存在及其密切的联系;经适当转换之后,二者相互等价!

具体地,自顶而下逐层考查红黑树各节点。每遇到一个红节点,都将对应的子树整体提升一层,从而与其父节点(必黑)水平对齐,二者之间的联边则相应地调整为横向。

如此转换之后,横向边或向左或向右,但由红黑树的条件3,同向者彼此不会相邻;即便不考虑联边的左右方向,沿水平方向相邻的边至多两条(向左、右各一条),涉及的节点至多三个(一个黑节点加上零到两个红节点)。此时,若将原红黑树的节点视作关键码,沿水平方向相邻的每一组(父子至多三个)节点即恰好构成4阶B树的一个节点。图2.1针对所有可能的四种情况,分别给出了具体的转换过程。

图2.1 红黑树到4阶B树的等价变换
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值