红黑树详解

合集下载

java treemap实现原理

java treemap实现原理

java treemap实现原理Java TreeMap是Java中非常常用的一种数据结构,使用红黑树作为其底层实现。

它提供了一种将键映射到值的方式,键是唯一的,并且按照升序进行排序。

Java TreeMap的实现原理是非常有趣的,它主要涉及到红黑树、迭代器、比较器等知识点。

在本文中,我们将深入了解Java TreeMap的实现原理,并理解如何在代码中使用它。

1. 红黑树红黑树是一种自平衡的二叉搜索树。

它通过保持一些简单规则来保证树的平衡,以确保左右子树的高度之差不超过1,并且保证每个节点的颜色都为红色或黑色。

这些规则允许红黑树保持在O(log n)的时间复杂度下进行插入、搜索和删除操作。

在Java TreeMap中,红黑树被用作底层存储结构。

当添加一个新的键值对时,它会首先检查根节点是否为空。

如果是,则创建一个新的节点并将其设置为根节点。

否则,它会沿着树的路径查找适当的叶子节点,并将其插入为其左侧或右侧的子节点。

为了保持树的平衡,通过旋转和重新着色来调整节点的颜色和位置。

每个节点都有一个颜色标记,标记为红色或黑色,红色表示该节点是一个违反规则的节点,黑色表示该节点是一个符合规则的节点。

2. TreeMap的比较器Java TreeMap还有另一个重要的组件,即比较器。

所有元素的排序都是通过比较器来定义的。

比较器定义了如何将元素按照升序排列,应该提供一个实现了 Comparator 接口的类。

在Java TreeMap的实现中,比较器用来将元素按照顺序排列。

它允许 TreeMap 将元素按照自定义顺序排序而不是按照它们的自然顺序排序。

也就是说,比较器的作用是自定义元素排序的规则并将其存储在TreeMap中。

3. TreeMap的迭代器Java TreeMap还提供了迭代器,用于遍历TreeMap中的元素。

什么是迭代器?迭代器是用于遍历集合或列表中元素的指针。

在Java中,每个集合或列表都可以通过iterator() 方法返回它的迭代器。

c++map的底层实现原理

c++map的底层实现原理

c++map的底层实现原理
C++ STL中的map是通过红黑树实现的,红黑树是一种自平衡的二叉查找树,它的插入、删除、查找操作都能在对数时间复杂度内完成,可以保证较稳定的性能。

具体来说,map内部是用一颗红黑树(Red-Black Tree)实现的。

红黑树是一种对平衡性要求比较低的二叉查找树(Binary Search Tree),在红黑树上进行查找、插入、删除等操作的时间复杂度都是log(N)。

红黑树的特点是每个节点要么是红色,要么是黑色,并且满足以下规则:
1、根节点是黑色的;
2、每个叶子节点都是黑色的空节点(NIL节点);
3、如果一个节点是红色的,则它的子节点必须是黑色的;
4、从任一节点到其每个叶子节点的所有路径都包含相同数目的黑色节点;
由于map底层采用红黑树实现,因此它具有以下特点:
1、自动排序;
2、查找、插入、删除操作的时间复杂度都是O(logN),极端情况下会退化成链表;
3、可以支持迭代器操作,比如反向迭代;
4、支持按照自定义规则排序;
综上所述,map的底层实现原理是通过红黑树实现的,红黑树是一种自平衡的二叉查找树,能够保证较稳定的性能。

c语言红黑树遍历序算法

c语言红黑树遍历序算法

c语言红黑树遍历序算法红黑树是一种自平衡的二叉查找树,它具有良好的平衡性能,能够保持在较低的高度范围内。

在C语言中,我们可以使用递归或者非递归的方式来实现红黑树的遍历。

下面我将分别介绍中序遍历、前序遍历和后序遍历的算法。

1. 中序遍历算法:中序遍历的顺序是先遍历左子树,然后访问根节点,最后遍历右子树。

在C语言中,我们可以使用递归实现中序遍历:c.void inOrderTraversal(struct Node root) {。

if (root != NULL) {。

inOrderTraversal(root->left);printf("%d ", root->data);inOrderTraversal(root->right);}。

}。

2. 前序遍历算法:前序遍历的顺序是先访问根节点,然后遍历左子树,最后遍历右子树。

同样可以使用递归实现前序遍历:c.void preOrderTraversal(struct Node root) {。

if (root != NULL) {。

printf("%d ", root->data);preOrderTraversal(root->left);preOrderTraversal(root->right);}。

}。

3. 后序遍历算法:后序遍历的顺序是先遍历左子树,然后遍历右子树,最后访问根节点。

同样可以使用递归实现后序遍历:c.void postOrderTraversal(struct Node root) {。

if (root != NULL) {。

postOrderTraversal(root->left);postOrderTraversal(root->right);printf("%d ", root->data);}。

}。

另外,以上是使用递归实现的遍历算法,也可以使用非递归的方式来实现,利用栈来辅助实现遍历。

红黑树的特点范文

红黑树的特点范文

红黑树的特点范文红黑树是一种自平衡的二叉树,它具有以下特点:1.二叉树属性:红黑树满足二叉树的基本性质,即对于树中的每个节点,其左子树的所有节点的值都小于该节点的值,而右子树的所有节点的值都大于该节点的值。

2.红黑性质1:每个节点要么是红色,要么是黑色。

3.红黑性质2:根节点是黑色的。

4.红黑性质3:每个叶子节点(NIL节点,空节点)是黑色的。

5.红黑性质4:如果一个节点是红色的,那么它的两个子节点都是黑色的。

6.红黑性质5:对于每个节点,从该节点到其所有后代叶子节点的简单路径上,均包含相同数量的黑色节点。

7.黑高度相等:从根节点到任意叶子节点的路径上的黑色节点数量必须相同,这个数量成为黑高度。

红黑树之所以被称为“红黑树”,是因为它的节点可以被标记为红色或黑色,并且通过这些颜色的约束规则实现了平衡性。

1. 自平衡性:通过红黑性质的约束规则,红黑树能够自动平衡,保持树的高度相对较低,从而能够提供较快的、插入和删除操作的平均时间复杂度为O(log n),保证了树的高效性能。

2.结构简单:红黑树的基本特点较为简单,只有5个约束规则,相较于AVL树等平衡二叉树,实现和维护的复杂度较低。

3.有序性:红黑树是一个有序树,即树中的节点按照特定的顺序排列。

这使得红黑树非常适用于需要有序数据的场景,例如字典、索引等。

4. 广泛应用:红黑树被广泛应用于各种数据结构和算法中,如集合、映射、区间树、数据库索引等。

在C++的STL库中,map和set容器的实现就是基于红黑树。

红黑树的缺点:1.相对复杂:相较于其他二叉树,红黑树的实现和维护较为复杂,因为需要遵循红黑性质。

这增加了代码的复杂度和难度。

2. 插入和删除操作相对慢:虽然红黑树的平均情况下插入和删除的时间复杂度为O(log n),但相较于普通二叉树,红黑树在实际性能上略慢一些。

总结:红黑树是一种自平衡的二叉树,通过红黑性质的约束规则,保持树的平衡性和有序性。

它具有较高的查询、插入和删除效率,并且广泛应用于各种数据结构和算法中。

快堆的工作原理

快堆的工作原理

快堆的工作原理快堆(QuickHeap)是一种快速分配和释放内存的算法,可以支持一次性分配和释放大量内存块,提高系统资源的利用率。

它一般利用两种经典算法实现:红黑树和跳跃列表。

红黑树(Red-Black Tree)又称为二叉搜索树,它有如下特性:1、每个节点都有一个指向另一个节点的左右子节点的指针;2、每个节点的值大于其左子节点的值,小于其右子节点的值;3、每个节点都有一个颜色,可以是红色或黑色;4、根节点是黑色的;5、每个叶子节点都是黑色的(叶子节点是不具有子节点的节点);6、如果该节点是红色的,它的子节点必须是黑色的;7、任意节点到其子孙节点的路径上,不能有两个连续的红色节点。

当使用红黑树时,快堆先将内存分为多个独立的内存块,并将这些内存块插入到红黑树中,每个内存块有一个内存大小的标签,当需要分配内存时,快堆便会去红黑树中查找最小值,并将这个值从红黑树中移除。

这样便实现了能够比较快速地从红黑树中分配内存块的效果。

跳跃列表(Skip List)是一种随机化的数据结构,它是一个有序链表,但是每一个节点都有多个指针指向其他节点,这些指针称为索引,索引的数量取决于链表的长度,索引能够提高搜索的效率。

使用跳跃列表时,快堆会先将内存分为多个独立的内存块,并将这些内存块插入到跳跃列表中,每个内存块有一个内存大小的索引,当需要分配内存时,快堆便会去跳跃列表中查找最小值,并将这个值从跳跃表中移除。

由于跳跃表中有索引,可以更快地定位到内存块,因此,能够更快速地从跳跃表中分配内存块。

总之,快堆是一种快速分配和释放内存的算法,可以支持一次性分配和释放大量内存块,提高系统资源的利用率。

它可以通过红黑树和跳跃列表的方式实现快堆,分别具有在分配内存时能够从红黑树和跳跃列表中较快速地定位到内存块的优点,即能够更快地分配内存块。

c map的实现原理

c  map的实现原理

c map的实现原理
map是一种关联容器,它存储一对关联的键(key)和值(value)。

在实现上,map一般采用红黑树(Red-Black Tree)来组织和管理这些数据。

红黑树是一种自平衡的二叉查找树,它具有以下特性:
1. 每个节点都有一个颜色属性,可以是红色或黑色。

2. 根节点和叶子节点(空节点)都是黑色。

3. 如果一个节点是红色,那么它的子节点都是黑色。

4. 从任一节点到其每个叶子节点的路径上都具有相同数目的黑色节点。

通过使用这种红黑树数据结构,map可以高效地实现插入、查找和删除操作。

当我们向map中插入键值对时,它会根据键的大小来找到正确的位置,并将该键值对插入到红黑树合适的位置上。

在查找操作中,map会利用红黑树的特性进行二叉查找,以高效地定位到指定键对应的值。

而在删除操作中,map 会删除对应的键值对,并重新调整红黑树的结构,以保持树的平衡性和特性。

红黑树的自平衡特性保证了map的操作具有较好的时间复杂度。

在最坏情况下,每个操作的时间复杂度为O(logN),其中N是存储在map中的键值对的数量。

这使得map非常适用于需要高效地插入、查找和删除关联数据的场景。

总结:map通过使用红黑树来实现关联容器的功能,红黑树的自平衡特性保证了map操作的高效性和稳定性。

hashmap转红黑树条件(一)

hashmap转红黑树条件(一)

hashmap转红黑树条件(一)HashMap转红黑树条件介绍在Java中,HashMap是一种常用的数据结构,用于存储键值对。

当HashMap的容量超过一定阈值时,会将存储结构从链表转换为红黑树,以提高查找效率。

本文将介绍HashMap转红黑树的条件。

HashMap和红黑树简介•HashMap是一种基于哈希表的数据结构,它使用键值对的方式存储数据。

•红黑树是一种自平衡的二叉查找树,它在插入和删除操作后会自动调整树的结构以保持平衡。

HashMap转红黑树条件当HashMap的某个桶(bucket)中的元素数量超过一个阈值时,就会将该桶中的链表转换为红黑树。

具体的条件如下: - HashMap的容量(table的长度)大于64。

- 某个桶中的元素数量大于8。

转换过程当达到转换条件后,HashMap会通过调用treeifyBin()方法将链表转换为红黑树。

具体的转换过程如下: 1. 创建一个新的红黑树节点作为根节点。

2. 遍历链表中的每个元素,依次将元素插入红黑树中。

3. 如果插入后红黑树的数量超过了8个,那么将红黑树调整为平衡状态。

4. 将原来的链表头节点指向新的红黑树节点。

转换条件的作用将HashMap中的链表转换为红黑树的作用主要有两方面: 1. 提高查询效率:红黑树的平均查找时间复杂度为O(log n),而链表的时间复杂度为O(n)。

2. 减少哈希碰撞:当HashMap中的某个桶中元素数量过多时,链表的性能会下降,转换为红黑树可以减少哈希碰撞的概率。

总结HashMap转红黑树的条件是HashMap的容量大于64,并且某个桶中的元素数量大于8。

转换后可以提高查询效率和减少哈希碰撞的概率。

在实际应用中,我们应该根据具体的场景和数据量来选择合适的HashMap容量和转换阈值,以充分利用红黑树的优势。

红黑树(R-BTree)

红黑树(R-BTree)

红⿊树(R-BTree)R-B Tree简介R-B Tree,全称是Red-Black Tree,⼜称为“红⿊树”,它⼀种特殊的⼆叉查找树。

红⿊树的每个节点上都有存储位表⽰节点的颜⾊,可以是红(Red)或⿊(Black)。

红⿊树的特性:(1)每个节点或者是⿊⾊,或者是红⾊。

(2)根节点是⿊⾊。

(3)每个叶⼦节点(NIL)是⿊⾊。

[注意:这⾥叶⼦节点,是指为空(NIL或NULL)的叶⼦节点!](4)如果⼀个节点是红⾊的,则它的⼦节点必须是⿊⾊的。

(5)从⼀个节点到该节点的⼦孙节点的所有路径上包含相同数⽬的⿊节点。

注意:(01) 特性(3)中的叶⼦节点,是只为空(NIL或null)的节点。

(02) 特性(5),确保没有⼀条路径会⽐其他路径长出俩倍。

因⽽,红⿊树是相对是接近平衡的⼆叉树。

红⿊树⽰意图如下:红⿊树的应⽤红⿊树的应⽤⽐较⼴泛,主要是⽤它来存储有序的数据,它的时间复杂度是O(lgn),效率⾮常之⾼。

例如,Java集合中的和,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红⿊树去实现的。

红⿊树的时间复杂度和相关证明红⿊树的时间复杂度为: O(lgn)下⾯通过“数学归纳法”对红⿊树的时间复杂度进⾏证明。

定理:⼀棵含有n个节点的红⿊树的⾼度⾄多为2log(n+1).证明:"⼀棵含有n个节点的红⿊树的⾼度⾄多为2log(n+1)" 的逆否命题是 "⾼度为h的红⿊树,它的包含的内节点个数⾄少为 2h/2-1个"。

我们只需要证明逆否命题,即可证明原命题为真;即只需证明"⾼度为h的红⿊树,它的包含的内节点个数⾄少为 2h/2-1个"。

从某个节点x出发(不包括该节点)到达⼀个叶节点的任意⼀条路径上,⿊⾊节点的个数称为该节点的⿊⾼度(x's black height),记为bh(x)。

关于bh(x)有两点需要说明:第1点:根据红⿊树的"特性(5) ,即从⼀个节点到该节点的⼦孙节点的所有路径上包含相同数⽬的⿊节点"可知,从节点x出发到达的所有的叶节点具有相同数⽬的⿊节点。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

红黑树详解在本文,我将比较透彻地讲解红黑树。

本文适合那些有对二叉树有一定的基础,并且熟悉C语言的读者。

本文最主要的参考资料是《Introduction to Algorithms 3rd Edition》。

1.1 二叉查找树1.1.1 基本概念二叉查找树是在数据结构中比较重要的数据结构之一,从外部看它满足集合性质,具有查找,插入和删除的基本功能,同时还可以求最大值和最小值。

由于二叉查找树独特的性质,它特别适合用来存储动态集合。

定义:对于二叉树上的所有结点x,如果y是x的左子树,那么y.key ≤ x.key。

如果y 是x的右子树,那么y.key ≥ x.key,这样的二叉树就称为二叉查找树(Binary Search Tree)。

我们关心的二叉查找树的逻辑结构,下面的两棵二叉树:图1 二叉查找树。

(a)这一棵高度为3的二叉树,因为10比15小,所以10在15的左子树上;同理在以10为根的左子树里,7比10小所以7在左子树上,12在10为根的子树的右子树上;20在以15为根的右子树上。

(b)这是一棵高度是4的二叉查找树,它的所有key与图(a)是一样的。

在图(a)中,查找最坏的情况是7和12,它们需要经过3次比较才能找到,而图(b)最坏情况是20,需要经过4次比较才能找到。

要想二叉树的查找的花费时间小,我们尽可能让二叉树不出现类以于单链形态的二叉树,让树的高度尽量的低。

对于高度为h的二叉查找树,从树根对叶子最坏的情况是比较h 次。

也就是说,对于高度为h的二叉查找树的最坏查找情况的运行时间是O(h)。

二叉树的查找效率取决于树的高度。

1.1.2 操作二叉树做为动态集,它有查找、插入、删除、最大值、最小值、前驱和后继这些基本操作。

为了后序的方便,我们定义了结点和树,另外我们还用0表示空子树。

查找在二叉查找树中根据给定的key找到该结点。

由于二叉树的性质,我们就知道,如果目标key比当前结点的key要小,那么目标结点必定在当前结点的左子树上。

最小值与最大值我们来分析一下最小值的位置。

我们认为最小值的位置是从根出发一直沿结点的左子树直到某个结点x的左子树为空,那么这个结点x就是整个二叉树中key最小的结点。

注意,我们并没有做任何key的比较。

证明:假设这个结点x不是最小值,另外有最小值结点y,那么y.k > x.k。

如果y是x 的祖先,因为x位于y的左子树上,那么x肯于定比y要小,所以y不是x的祖先。

如果y 不是x的祖先,假设y与x的最小的共同祖先的z,又因为y不是x的祖先,所以y在z的右子树上,所以z.k < y.k,并且有z.k > x.k,与假设的y.k > x.k矛盾,所以假设不成立,x 是二叉查找树中key最小结点。

最大值的分析方法也是一样的。

前驱和后继前驱与后继定义来源于二叉树中序遍历的key序列。

我们知道二叉的中序遍历的key序列是一个升序序列。

在二叉查找树中,对于结点x,如果有结点y,满足y.key>x.key并且y 是这些结点中key最小的,那么y就称之为x的后继。

同理,在二叉查找树中,对于结点x,如果有结点y,满足y.key<x.key并且y是这些结点中key最小的,那么y就称之为x的前驱。

在二叉查找树中,如果x是y的前驱,那么y就是x的后继。

图2结点的后继和前驱。

(a)y是x的后继,因为y没有左子树,所以y是x右子树上key最小的结点。

(b)y是x的后继,因为x的左子不为空,所以y是x左子树中最左那个小那个,所以y是x的后继。

(c)x是y的前驱,因为y没有左子树,所以y是x左子树上key最大的那个结点。

(d)y是x的前驱,因为x有左子树,所以x左子树上key最大的在x左子树上最右的那个结点。

也有可能是z右孩子的最左的那个子孙结点(图b所示)。

如果y是的后继,那么y就是x的前驱。

对于某个结点y它的后继的位置是:如果y的右子树存在,那么后继是y的右子树中的key最小的结点;如果y的右子树不存在,那么我们只要找到哪个结点的前驱是y,那么那个结点就是y的后继(图2中的d)。

根据前驱和后继的定义,我们知道通过对树中最小值一直沿着后继直到结束,这样的序列就是中序遍历的序列。

下面给出中序遍历的代码:插入对二叉查找树的插入,不能破坏二叉查找树的性质,那么我们要结点插入到什么地方呢?答案是叶子,新插入的结点,都是将成为某个叶子结点的左孩子或者右孩子。

图3 二叉查找树的插入。

图中key为11的结点插入到树中,其中浅色结点表示插入时候比较的路径。

虚线表示插入的位置。

我们发现insert与search方法是一样的,只不过search是查找特定的key,而insert是查找合适的叶子结点的位置,它的运行时间为O(n)。

删除在介绍删除二叉查找算法之前,我们先来介绍一个辅助函数transplant,这个函数有3个参数,在树T中,将v替换u的位置,即u的双亲变成v的双亲,v替换u成为u双亲的孩子。

另外一个辅助函数replace,这个函数有3个参数,在树T中,将v完全代替u,即u 的双亲变成v的双亲,v替换u成为u双亲的孩子,另外左右孩子均为u的孩子。

图4演示了transplant中v在树中替换u的过程。

如果u是根,即v.p==0时,T的树根就改变了。

我们来考查一下待删除的结点是z。

那么z可能有几种情况:◆z没有右孩子;◆z有右孩子:z的右孩子有左孩子,z的右孩子没有左孩子。

图5 二叉树删除的三种情形。

图中z(浅色的)为待删除的结点。

(a)没有右孩子的删除,将z的左孩子替换z即可,z的左孩子有可能是NIL指针。

(b)z的右孩子不为空,y是z的后继,但右孩子的左孩子为空,我们知道z的右孩子就是z的继,所以用z的右孩子替换z即可。

(c)z的后继y不是z的右孩子,y的右孩子替换y,从树中移出y,将y作为z右孩子的双亲连接上,此时情形成了情形b了。

下面我具体针对这3种情形进行分解。

情形1,z没有右孩子,我们只要将左孩子替换z在树中位置就能完成删除操作,其实我们拿z的前驱替换也是可以的;情形2,z有右孩子,所以我们找到z的后继替换z。

因为z的key小于右子树所有的key(假设没有重复的key),那么z的后继就是右子树上的最小key。

如图5的中b和c,z的后继可能是z的右孩子(当右孩子没有左孩子就会出现该情况),那么调用transplant(T,z,y)。

另外,要连接上原来z的左子树;z的后继也有可能不是z的右孩子(图c所示的情况),首先我们调用transplant(T,y,y->r),这时候y已经从树中脱离了,然后我们将y嫁接到z的右孩子的双亲上,这样y就成了z右孩子的双亲了,这和情形b是同一种情况了。

下面是删除的代码:1.1.3 实现参考附件:bstree.c。

1.1.4 思考题1.Bunyan教授认为他发现了二叉查找树的一个重要的性质。

假设在二叉查找树上查找key为k的结点,并且key为k的结点是一个叶子结点。

那么有三个集合:A,搜索路径的左边结点的集合;B,搜索路径上的结点的集合;C是搜索路径右边的结点集合。

Buyan教授认为对于三个集合的任意值a∈A,b∈B,c∈C一定满足a≤b≤c。

对于上面的观点,请给出最小可能一个的反例。

2.证明:在高度为h的二叉查找树上,我们实现的动态集基本操作:min,max,successor,predecessor,search,insert和delete的运行时间都是O(h)。

3.在二叉查找树的删除操作中,假设我们不取z的后继而取z的前驱替换z,请相应对称的代码。

1.2 红黑树在上节的思考题中,我们证明了在高度为h的二叉查找树上,我们实现的动态集基本操作运行时间都是O(h)。

总而言之,树度h决定查找效率。

如果我们通过某种方法能够将二叉树尽可能的低,那么二叉树的查找效率将会大大地提高。

对于一个含有n结点的最坏的情况是这n个结点形成一条单链,那么二叉查找树的树高为n,运行时间为O(n);那么最好情况是n个结点形了一棵完全二叉树。

所谓完全二叉树是指对于一棵高度为h的二叉树,除第h层外,其它各层的结点数都达到最大个数,并且第h层所有的结点都连续集中在最左边,这样的二叉树称为完全二叉树。

那么h介于lg n与lg n+1之间,也就是说运行时间为O(lg n)。

可以说它的效率是极高的。

1.2.1 基本概念如果我把二叉查找树的每个结点都涂上红色或者黑色。

如果它满足下面的5个性质,那么我们就称它为红黑树(Red Black Tree ):1.每个结点不是红色就是黑色。

2.根结点是黑色的。

3.每个叶子结点(NIL )都是黑色的。

4.如果一个结点是红色的,那么它所有的孩子都是黑色的。

5.对于每一个结点,从当前结点到后代的叶子的路径上包含黑色结点的数量是相同的。

根据红黑树的性质,我们可得出下面的结论:具有n 内部结点的红黑树的高度最高为2lg(n+1)。

在证明这个结论之前,我们来看看红黑树的表示。

每个结点到叶子结点(NIL )经过的黑色结点的个数(包括自已)称之为黑高度(black-height)。

我们把NIL 称之为外部结点,那些带有key 的“合法”的结点称之为内部结点。

图6 红黑树的表示。

key 为64的结点的黑高度为3,key 为26,81,14,44的结点黑高度为2,key 为5,19,30,76,92的结点黑高度为1。

证明:我们将红色结点吸附到黑色的双亲结点上,那么一个黑色结点最多可以吸附2个结点,并且可以有4个孩子,那么就形成了一个大结点,如图7所示。

这样树我称之为234树。

红黑树的数学本质就是234树,并且所有的“叶子”结点的高度都是相等的。

不难看出,黑高度就是这棵234树的高度。

图7 将图6中的红色结点吸附到双亲结点上,这样对应数学结构为234树。

对于高度为h 并且所有的“叶子”结点的高度都是相等的234树最多有多少个结点呢?要想结点最多,并且所有的“叶子”结点的相同。

那么它就是一棵满234树,每个结点的出度4,每个结点包含3个内部结点,那么对于高度为h 的234树,则树的结点个数n ,满足:314414144 (440)110-=--⨯=+++≤-h h h n (公式1)对于高度为h 并且所有的“叶子”结点的高度都是相等的234树最少有多少个结点呢?要想结点最少,那么它就退化出了满二叉树了。

所以,树的结点个数n 满足:12212122 (220)110-=--⨯=+++≥-h hh n (公式2)由公式2得出:12-≥h n 两边取对数h n ≥+)1lg(即)1lg(+≤n h 。

这里的h 是234树的高度,由前面所述,红黑数的黑高度就是对应234树的高度。

对于黑高度了h ,由性质2、3、4得出红色结点不可能多于黑色结点。

相关文档
最新文档