From 5371c108106c20c9f1179ff624787ab5d4f1c3da Mon Sep 17 00:00:00 2001 From: Didnelpsun <2675350965@qq.com> Date: Tue, 20 Sep 2022 22:45:20 +0800 Subject: [PATCH] Update 8-search.md --- Data-Structrue/8-search.md | 189 ++++++++++++++++++++++++++----------- 1 file changed, 133 insertions(+), 56 deletions(-) diff --git a/Data-Structrue/8-search.md b/Data-Structrue/8-search.md index 003de11..11ef47b 100644 --- a/Data-Structrue/8-search.md +++ b/Data-Structrue/8-search.md @@ -6,7 +6,7 @@ + 查找表(查找结构):用于查找的数据集合,由同一类型的数据元素或记录组成。 + 关键字:数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该唯一。 + 静态查找表:只查找符合条件的数据元素。(顺序查找、折半查找、散列查找) -+ 动态查找表:出来要查找,还要进行删除或插入,除了查找速度还要考虑插入删除操作是否方便。(二叉排序树查找、散列查找) ++ 动态查找表:出来要查找,还要进行删除或插入,除了查找速度还要考虑插入删除操作是否方便。(二叉查找树查找、散列查找) + 查找长度:查找运算中,需要对比关键字的次数。 + 平均查找长度$ASL$:所有查找过程中进行关键字比较次数的平均值。$ASL=\sum_{i=1}^nP_iC_i$。其中$P_i$表示查找第$i$个元素的概率,$C_i$表示查找第$i$个元素的查找长度。 @@ -87,12 +87,12 @@ $ASL$查找成功为$\dfrac{1+2+3+\cdots+n}{n}=\dfrac{n+1}{2}$,$ASL$查找失 + 折半查找判定树一定是一个平衡二叉树。只有最下面一层不满,元素个数为$n$时树高与完全二叉树相等$h=\lceil\log_2(n+1)\rceil$。 + 根据折半查找判定树可以计算对应的$ASL$:查找成功的$ASL$=($\sum\limits_{i=1}^n$第$i$层的成功结点数$\times i$)$\div$成功结点总数,查找失败的$ASL$=($\sum\limits_{i=1}^n$第$i$层的失败结点数$\times i$)$\div$失败结点总数。 -+ 折半查找判定树也是一个二叉排序树,失败结点$=n+1$(成功结点的空链域节点数)。 ++ 折半查找判定树也是一个二叉查找树,失败结点$=n+1$(成功结点的空链域结点数)。 + 折半查找判定树的中序序列应该是一个有序序列。 $ASL$查找成功查找失败都一定小于折半查找树的树高,时间复杂度为$O(\log_2n)$。 -查找的折半查找判定树和排序的二叉排序树都是同样的二叉逻辑结构,但是不同的是折半查找判定树是已知完整序列,所以总是从中间开始,时间性能为固定的$O(\log_2n)$,而二叉排序树的构造是根据输入来的,如果输入的序列正好是从中间切分的,则时间性能为最好的$O(\log_2n)$,如果输入的序列恰好有序,则为单枝树,时间性能为最坏的$O(n)$。 +查找的折半查找判定树和排序的二叉查找树都是同样的二叉逻辑结构,但是不同的是折半查找判定树是已知完整序列,所以总是从中间开始,时间性能为固定的$O(\log_2n)$,而二叉查找树的构造是根据输入来的,如果输入的序列正好是从中间切分的,则时间性能为最好的$O(\log_2n)$,如果输入的序列恰好有序,则为单枝树,时间性能为最坏的$O(n)$。 ### 分块查找 @@ -128,17 +128,17 @@ $ASL$查找成功失败的情况都十分复杂,所以一般不会考。 ## 二叉查找 -### 二叉排序树 +### 二叉查找树 即$BST$,是一种用于排序的二叉树。 -#### 二叉排序树定义 +#### 二叉查找树定义 -二叉排序树也是二叉查找树。左子树上所有结点的关键字均小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关键字;左右子树又各是一棵二叉排序树。 +二叉查找树也是二叉排序树。左子树上所有结点的关键字均小于根结点的关键字;右子树上所有结点的关键字均大于根结点的关键字;左右子树又各是一棵二叉查找树。 -中序遍历二叉排序树会得到一个递增的有序序列。 +中序遍历二叉查找树会得到一个递增的有序序列。 -#### 二叉排序树查找 +#### 二叉查找树查找 1. 若树非空,目标值与根结点的值比较。 2. 若相等则查找成功,返回结点指针。 @@ -149,36 +149,36 @@ $ASL$查找成功失败的情况都十分复杂,所以一般不会考。 查找成功的平均查找长度$ASL$,二叉树的平均查找长度为$O(\log_2n)$,最坏情况是每个结点只有一个分支,平均查找长度为$O(n)$。 -#### 二叉排序树插入 +#### 二叉查找树插入 -+ 若原二叉排序树为空,就直接插入结点。 ++ 若原二叉查找树为空,就直接插入结点。 + 否则,若关键字小于根结点值,插入左结点树。 + 若关键字大于根结点值,插入右结点树。 -#### 二叉排序树删除 +#### 二叉查找树删除 + 搜索到对应值的目标结点。 -+ 若被删除结点$p$是叶子结点,则直接删除,不会破坏二叉排序树的结构。 ++ 若被删除结点$p$是叶子结点,则直接删除,不会破坏二叉查找树的结构。 + 若被删除结点只有一棵左子树或右子树,则让该结点的子树称为该结点父结点的子树,来代替其的位置。 -+ 若被删除结点有左子树和右子树,则让其结点的直接后继(中序排序该结点后一个结点,其右子树的最左下角结点,不一定是叶子结点)或直接前驱(中序排序该结点前一个结点,其左子树的最右下角结点,不一定是叶子结点)替代该结点,并从二叉排序树中删除该的结点直接后继、直接前驱,这就变成了第一种或第二种情况。 ++ 若被删除结点有左子树和右子树,则让其结点的直接后继(中序排序该结点后一个结点,其右子树的最左下角结点,不一定是叶子结点)或直接前驱(中序排序该结点前一个结点,其左子树的最右下角结点,不一定是叶子结点)替代该结点,并从二叉查找树中删除该的结点直接后继、直接前驱,这就变成了第一种或第二种情况。 -二叉排序树删除或插入时得到的二叉排序树往往与原来的不同。 +二叉查找树删除或插入时得到的二叉查找树往往与原来的不同。 -#### 二叉排序树查找效率 +#### 二叉查找树查找效率 -二叉排序树的查找效率主要取决于树的高度,若是平衡二叉树,则平均查找长度为$O(\log_2n)$,若最坏情况下只有一个单枝树,则平均查找长度为$O(n)$。 +二叉查找树的查找效率主要取决于树的高度,若是平衡二叉树,则平均查找长度为$O(\log_2n)$,若最坏情况下只有一个单枝树,则平均查找长度为$O(n)$。 若按顺序输入关键字则会得到单枝树。 -查找过程来看,二叉排序树和二分查找类似。但是二分查找的判定树唯一,而二叉排序树的查找不唯一,相关关键字插入顺序会极大影响到查找效率。 +查找过程来看,二叉查找树和二分查找类似。但是二分查找的判定树唯一,而二叉查找树的查找不唯一,相关关键字插入顺序会极大影响到查找效率。 -从维护来看,二叉排序树插入删除操作只需要移动指针,时间代价为$O(\log_2n)$,而二分查找的对象是有序顺序表,代价是$O(n)$。 +从维护来看,二叉查找树插入删除操作只需要移动指针,时间代价为$O(\log_2n)$,而二分查找的对象是有序顺序表,代价是$O(n)$。 -所以静态查找时使用顺序表进行二分查找,而动态查找时使用二叉排序树。 +所以静态查找时使用顺序表进行二分查找,而动态查找时使用二叉查找树。 ### 平衡二叉树 -为了限制判定树高增长过快,降低二叉排序树的性能,规定插入时要保证平衡。 +为了限制判定树高增长过快,降低二叉查找树的性能,规定插入时要保证平衡。 即$AVL$树,树上任意一结点的左子树和右子树的高度之差不超过$1$。 @@ -196,17 +196,17 @@ $ASL$查找成功失败的情况都十分复杂,所以一般不会考。 $h$为平衡二叉树高度,$n_h$为构造此高度的平衡二叉树所需的最少结点数。 -+ 平衡二叉树最少结点数的递推公式为$n_0=0$,$n_1=1$,$n_2=2$,$n_h=1+n_{h-1}+n_{h-2}$。此时所有非叶结点的平衡因子均为$1$。 ++ 平衡二叉树最少结点数(所有非叶结点的平衡因子均为$1$的)的递推公式为$n_0=0$,$n_1=1$,$n_2=2$,$n_h=1+n_{h-1}+n_{h-2}$。此时所有非叶结点的平衡因子均为$1$。 -假设$T$为高度为$h$的平衡二叉树,其需要最少的节点数目为$F(h)$。 +假设$T$为高度为$h$的平衡二叉树,其需要最少的结点数目为$F(h)$。 又假设$TL$,$TR$为$T$的左右子树,因此$TL$,$TR$也为平衡二叉树。 -假设$FL$、$FR$为$TL$,$TR$的最少节点数,则,$F(h)=FL+FR+1$。那么$FL$、$FR$到底等于多少呢? +假设$FL$、$FR$为$TL$,$TR$的最少结点数,则,$F(h)=FL+FR+1$。那么$FL$、$FR$到底等于多少呢? -由于$TL$,$TR$与$T$一样是平衡二叉树,又由于我们知道$T$的最少节点数是$F(h)$,其中$h$为$T$的高度,因此如果我们知道$TL$,$TR$的高度就可以知道$FL$、$FR$的值了。 +由于$TL$,$TR$与$T$一样是平衡二叉树,又由于我们知道$T$的最少结点数是$F(h)$,其中$h$为$T$的高度,因此如果我们知道$TL$,$TR$的高度就可以知道$FL$、$FR$的值了。 -由平衡二叉树的定义可以知道,$TL$和$TR$的高度要么相同,要么相差$1$,而当$TL$与$TR$高度相同(即都等于$h-1$)时,我们算出来的$F(h)$并不能保证最小,两边都是$h-1$明显比只有一边$h-2$的节点数更多。 +由平衡二叉树的定义可以知道,$TL$和$TR$的高度要么相同,要么相差$1$,而当$TL$与$TR$高度相同(即都等于$h-1$)时,我们算出来的$F(h)$并不能保证最小,两边都是$h-1$明显比只有一边$h-2$的结点数更多。 因此只有当$TL$与$TR$高度相差一,即一个高度为$h-1$,一个高度为$h-2$时,计算出来的$F(h)$才能最小。 @@ -218,9 +218,9 @@ $h$为平衡二叉树高度,$n_h$为构造此高度的平衡二叉树所需的 #### 平衡二叉树插入 -最重要的是根据二叉排序树的大小关系算出从大到小的序列,然后把最中间的作为新根,向两侧作为左右子树。 +最重要的是根据二叉查找树的大小关系算出从大到小的序列,然后把最中间的作为新根,向两侧作为左右子树。 -即先找到插入路径上离插入结点最近的平衡因子的绝对值大于$1$的结点$A$,再对以$A$为根的子树,在保持二叉排序树特性的前提下调整各结点位置。 +即先找到插入路径上离插入结点最近的平衡因子的绝对值大于$1$的结点$A$,再对以$A$为根的子树,在保持二叉查找树特性的前提下调整各结点位置。 每次调整的都是最小不平衡子树。 @@ -230,7 +230,7 @@ $h$为平衡二叉树高度,$n_h$为构造此高度的平衡二叉树所需的 不同的是插入操作只对子树进行调整,而删除操作可能要对整个树进行调整。 -在任意一棵非空二叉排序树$T_1$中,删除某结点$v$之后形成二叉排序树$T_2$,再将$v$插入$T_2$,形成二叉排序树$T_3$。 +在任意一棵非空二叉查找树$T_1$中,删除某结点$v$之后形成二叉查找树$T_2$,再将$v$插入$T_2$,形成二叉查找树$T_3$。 + 若$v$是$T_1$的叶结点,则$T_1$与$T_3$相同。 + 若$v$不是$T_1$的叶结点,则$T_1$与$T_3$不同(如果是一定不同则是错误的)。 @@ -441,7 +441,7 @@ AL(H) CL(H-1) CR(H) BR(H) #### 红黑树定义 -为了维持二叉平衡树,需要反复对树整体进行插入合删除,代价巨大,所以引入为弱化版相对平衡的二叉排序树——红黑树: +为了维持二叉平衡树,需要反复对树整体进行插入合删除,代价巨大,所以引入为弱化版相对平衡的二叉查找树——红黑树: 1. 每个结点或是红色,或是黑色的。 2. 根结点是黑色的。 @@ -456,62 +456,137 @@ AL(H) CL(H-1) CR(H) BR(H) 从根到叶结点的最长路径不大于最短路径的两倍。 + 由性质⑤,当从根到任一叶结点的简单路径最短时,这条路径必然全由黑结点构成(即第二层的结点)。 -+ 由性质④,当某条路径最长时,这条路径必然是由黑结点和红结点相间构成的,此时红结点和黑结点的数量相同(非第二层的其他所有节点)。 ++ 由性质④,当某条路径最长时,这条路径必然是由黑结点和红结点相间构成的,此时红结点和黑结点的数量相同(非第二层的其他所有结点)。 有$n$个内部结点的红黑树的高度$h\leqslant2\log_2(n+1)$。 + 若红黑树的总高度为$h$,则根结点黑高$\geqslant\dfrac{h}{2}$,所以内部结点$n\geqslant2^{\frac{h}{2}-1}$(假设没有红结点),所以$h\leqslant2\log2(n+1)$。 -红黑树查找、插入、删除的时间效率都是$O(\log_2n)$。 +红黑树查找、插入、删除的时间复杂度都是$O(\log_2n)$。 -+ 插入和删除:由于红黑树的每次操作平均要旋转一次和变换颜色,而普通二叉排序树如果平衡因子在指定范围内不会旋转,所以它比普通的二叉排序树效率要低一点,不过时间复杂度仍然是$O(\log_2n)$。 -+ 普通查询:没有使用到红黑树的性质,所以红黑树和二叉排序树的效率相同。 ++ 插入和删除:由于红黑树的每次操作平均要旋转一次和变换颜色,而普通二叉查找树如果平衡因子在指定范围内不会旋转(如果要旋转则可能旋转多次),所以它比普通的二叉查找树效率要低一点,不过时间复杂度仍然是$O(\log_2n)$。 ++ 普通查询:没有使用到红黑树的性质,所以红黑树和二叉查找树的效率相同。对于平衡树而言,平衡树的效率更高。 + 插入数据有序查询:红黑树的查询效率就比二叉搜索树要高了,因为此时二叉搜索树不是平衡树,它的时间复杂度$O(n)$。 -#### 红黑树插入 +#### 红黑树插入概述 -红黑树的插入过程和二叉查找树的插入过程基本类似,不同之处在于,红黑树中插入新结点后需要进行调整(主要通过重新着色或旋转操作进行),以满足红黑树的性质。 +假定当前结点为$x$,其父结点为$p$,叔父结点(父结点的兄弟结点)为$u$,祖父结点为$g$。 + +红黑树的插入过程和二叉查找树的插入过程基本类似,从右至左,右上至下。不同之处在于,红黑树中插入新结点后需要进行调整(主要通过重新着色或旋转操作进行),以满足红黑树的性质。 + 插入红黑树中的结点$z$初始着为红色。 假设新插入的结点初始着为黑色,那么这个结点质在的路径比其他路径多出一个黑结点(几乎每次插入都破坏性质⑤),调整起来也比较麻烦。如果插入的结点是红色的,此时所有路径上的黑结点数量不变,仅在出现连续两个红结点时才需要调整,而且这种调整也比较简单。 -插入过程: - -1. 用二叉查找树插入法插入,并将结点$z$着为红色。若结点$z$的父结点是黑色的,无须做任何调整,此时就是一棵标准的红黑树。 -2. 如果结点$z$是根结点,将$z$着为黑色(树的黑高增加一),结束。 -3. 如果结点$z$不是根结点,并且$z$的父结点 $z.p$是红色的,则分为下面三种情况,区别在于$z$的叔结点$y$的颜色不同,因$z.p$是红色的,插入前的树是合法的,根据性质②和④,爷结点$z.p.p$必然存在且为黑色。性质④只在$z$和$z.p$之间被破坏了。 +父结点|叔结点|插入类型|操作 +:----:|:------:|:------:|:--: +黑|-|-|无需操作 +红|黑|左左|右旋,变色 +红|黑|右右|左旋,变色 +红|黑|左右|左旋,右旋,变色 +红|黑|右左|右旋,左旋,变色 +红|红|-|父叔变红,祖父变黑,祖父变为当前结点,递归调整 插入全为红,是根则变黑;父黑无变化,父红看叔叔;叔红只变色,叔父爷全变,爷爷变儿子,重新来一遍;叔黑看平衡,看谁最后转,谁转谁变色。 +以$1\sim7$的序列构建红黑树: + ![红黑树插入][red-black] -#### 红黑树删除 +虽然有六种情况,但是由于两种是镜像的,所以归纳为四种。 -红黑树的播入操作容易导致连续的两个红结点,破坏性质④。而删除操作容易造成子树照高的变化(删除黑结点会导致根结点到叶结点间的黑结点数量减少),破坏性质⑤。 +#### 父结点黑 + +默认插入结点为红色,且父结点为黑,所以此时插入后不影响黑高和平衡,从而不需要调整。 + +插入$2$,只有一个父结点为根结点,没有叔结点,直接插入到$1$的右子树位置,没有其他变化。 + +#### 父结点红叔结点黑同侧插入 + +即插入类型为左左或右右,即在其祖父结点的左子树的左侧插入元素或其祖父结点的右子树的右侧插入元素。 + +由于插入结点为红色,父结点也为红色,不能出现连续的红色,所以就要变色,此时就应该先旋转。 + +由于是同侧插入,所以应该往另一侧旋转,旋转方式与二叉查找树一样,旋转完成后重新涂色。 + +插入$3$,$3$插入$2$的右子树位置,其父结点$2$为红色,而叔结点为$1$的右$NULL$结点为黑色,所以需要旋转,由于插入的是$2$的右侧,而$2$是其父结点的右子树,所以是同侧插入,需要反方向向左旋转,$2$结点上升变为根结点,$2$的左侧$NULL$结点给$1$结点的右侧,$1$下沉,$3$同样上升,完成旋转。然后涂色,根结点$2$为黑色,$NULL$为黑色,所以中间的$1$和$3$都涂成红色。 + +#### 父结点红叔结点黑异侧插入 + +即插入类型为左右或右左,即在其祖父结点的左子树的右侧插入元素或其祖父结点的右子树的左侧插入元素。 + +此时红黑树末端会不平衡,此时就需要向插入的同侧方向旋转一下,从而变成父结点红树结点黑同侧插入的情况,再按照这个类型的处理方式进行处理。 + +插入$5$,注意此时图中是按同侧插入,即$5$是插入到$4$这个右子树的右侧的,而现在我们将$5$插入到$4$的左子树位置。$5$的父结点$4$是红色的,其叔结点$3$的左$NULL$结点是黑色的,而$5$插入的位置是$4$所在右子树的结点左侧,所以符合异侧插入的处理方式。首先对$4$和$5$这个子树进行右旋,将$5$右侧的$NULL$给$4$的左子树位置,$5$上升变成$3$的子结点,$4$下沉变成$5$的子结点。此时就是同侧插入插入的情况。再进行左旋,$5$的左$NULL$结点给当前父结点$3$的右子树位置,$5$上升变为父结点,变成$2$的子结点,$3$、$4$下沉变为$5$的子结点。此时红黑树形态一样,但是$2$的子结点从$1$和$4$变成了$1$和$5$。 + +#### 父结点红叔结点红 + +由于插入结点为红色,父结点也为红色,不能出现连续的红色,所以就要变色。 + +这种情况是不需要进行旋转的。 + +由于父结点和叔结点都是红色,不能连续红色,所以将父结点和叔结点都涂为黑色;由于父结点和叔结点都是红色,所以其祖父结点一定是黑的,涂为黑色。此时将当前结点移动到祖父结点上,查看先祖结点的涂色是否正确,递归这个逻辑直到根结点,根结点一定是黑色的。 + +插入$4$,$4$插入$3$的右子树位置,由于不能连续的红色,所以其父结点$3$和叔结点$2$都变为黑色,祖父结点变为红色,由于祖父结点$2$为根结点,所以重新变成黑色。 + +#### 红黑树删除概述 + +红黑树的播入操作容易导致连续的两个红结点,破坏性质④。而删除操作容易造成子树黑高的变化(删除黑结点会导致根结点到叶结点间的黑结点数量减少),破坏性质⑤。 + +所以红黑树删除要比红黑树插入更复杂。 删除过程也是先执行二叉查找树的删除方法。若待删结点有两个孩子,不能直接删除,而要找到该结点的中序后继(或前驱)填补,即右子树中最小的结点,然后转换为删除该后继结点。由于后继结点至多只有一个孩子,这样就转换为待删结点是叶结点或仅有一个孩子的情况。 -最终,删除一个结点有以下两种情况∶ ++ 前驱结点为二叉查找树中序遍历中当前点的前一个结点,往往在其左子树的最右测。 ++ 后继结点为二叉查找树中序遍历中当前点的后一个结点,往往在其右子树的最左测。 -+ 待删结点没有孩子。 -+ 待删结点只有右子树或左子树 +对于二叉查找树删除而言有三种情况: -#### 红黑树与二叉排序树 +1. 被删除结点无子结点, 直接删除。 +2. 被删除结点只有一个子结点,用子结点替换要被删除的结点。 +3. 被删除结点有两个子结点,可以用前驱结点或者后继结点进行替换删除操作。 -由二叉排序树树的“高度平衡”,降低到红黑树的“任一结点左右子树的高度,相差不超过两倍”的“适度平衡”,也降低了动态操作时调整的频率。对于一棵动态查找树,如果插入和删除操作比较少,查找操作比较多,采用$AVL$树比较合适,否则采用红黑树更合适。 +第一种情况不用多考虑,融合后两种情况并结合红黑树特性分为三种情况。 -二叉排序树使用平衡因子来约束树高,而红黑树用黑高相同约束树高。 +以完成所有插入后的红黑树为例。 -二叉排序树只要平衡因子不超过$1$的绝对值就不用每次调整树整体,而红黑树每次插入货删除都需要进行对树进行调整。 +#### 填充结点红 + +即删除后用来填补该位置的结点为红色结点。 + +此时无论当前结点是什么颜色,删除后不影响黑高,所以不影响红黑树平衡。 + +1. 当前结点为红:删除$4$,后继结点$5$为红结点,所以直接$5$替换$4$的位置并变红,其他不变。 +2. 当前结点为黑:删除$6$,后继结点$7$为红结点,所以直接$7$替换$6$的位置并变黑,其他不变。 + +#### 填充结点黑且为左结点 + +即删除后用来填补该位置的结点为黑色结点,且该结点为其父结点的左子结点。 + +1. 填充结点的兄弟结点是红结点:删除$2$,前驱结点$1$为黑结点,其兄弟结点$4$为红结点。 +2. 填充结点的兄弟结点是黑色,同时兄弟结点的右子结点是红色的,左子结点任意颜色:删除$4$,前驱结点$3$为黑结点,其兄弟结点$6$为黑结点,$6$的右子结点$7$为红结点。 + +#### 填充结点黑且为右结点 + +即删除后用来填补该位置的结点为黑色结点,且该结点为其父结点的右子结点。 + +#### 红黑树与二叉查找树 + +由二叉查找树树的“高度平衡”,降低到红黑树的“任一结点左右子树的高度,相差不超过两倍”的“适度平衡”,也降低了动态操作时调整的频率。对于一棵动态查找树,如果插入和删除操作比较少,查找操作比较多,采用$AVL$树比较合适,否则采用红黑树更合适。 + +二叉查找树使用平衡因子来约束树高,而红黑树用黑高相同约束树高。 + +二叉查找树只要平衡因子不超过$1$的绝对值就不用每次调整树整体,而红黑树每次插入货删除都需要进行对树进行调整。 #### 红黑树与B树 红黑树在被发明之初被称为平衡二叉$B$树,所以红黑树与$B$树之间必然有联系。 -+ 将红黑树的所有红色节点上移到和他们的父节点同一高度上组成一个$B$树结点,就会得到一棵四阶$B$树。 -+ 红黑树的黑色节点个数与四阶$B$树的节点总个数相等。 -+ 在所有的$B$树节点中,黑色节点是父节点,红色节点是子节点。黑色节点在中间,红色节点在两边。 ++ 将红黑树的所有红色结点上移到和他们的父结点同一高度上组成一个$B$树结点,就会得到一棵四阶$B$树。 ++ 红黑树的黑色结点个数与四阶$B$树的结点总个数相等。 ++ 在所有的$B$树结点中,黑色结点是父结点,红色结点是子结点。黑色结点在中间,红色结点在两边。 + +![red-black-b] ## 树表查找 @@ -530,7 +605,7 @@ AL(H) CL(H-1) CR(H) BR(H) 而能保证这两点的查找树,就是一棵$B$树,即多路平衡查找树,多少叉,就是一棵多少阶的$B$树。 -非叶结点定义:$\{n,P_0,K_1,P_1,\cdots,K_n,P_n\}$。其中$K_i$为结点关键字,$K_1