树与二叉树4之从多叉树到红黑树

一、二叉树到多叉树

树结构是为了方便快捷的实现查找操作的,树的高度是命中查找的一个不可抗拒的时间下限。在一定的数据条件下,树的高度和宽度是互相制约的。(就像一定面积下,矩形的长和宽是互相制约的。)

二叉树尽管简单易于实现,实际中构造出来的树的高度很很高的,不利于查找,也就有了我们上一篇中关于平衡二叉树的内容,那么如何能降低树的高度呢?这就需要引入多叉树,通过加大树的宽度来降低其高度

二、多叉树

二叉树中每个结点有一个数据项,最多有两个子结点,如果允许每个结点有多个数据项和多个子结点,那么这个树就是多叉树.

树的每个节点可以有两个以上的子节点,称为m阶的多叉树,或者称为m叉树。

性质

  • 每个节点有m个子节点和m-1个键值。
  • 每个节点中的键值按升序排列。
  • 前i个子节点中的键值都小于第i个键值。
  • 后m-1个子节点中的键值都大于第i个键值。

典型的多叉树有2-3-4-Tree, B-Tree.

3、2-3-4-Tree

2-3-4-Tree是多叉树,它的每个节点最多有四个子节点和三个数据项。

2-3-4树像红黑树一样是平衡树。它的效率比红黑树稍差,但是编程容易。是红黑树的基础

上图展示的就是一棵2-3-4树,每个节点可以保存一个、两个或者三个数据项。 
上图中上面三个节点有子节点,底层的六个节点都是叶节点,没有子节点。2-3-4树中所有的叶节点都是在一层上的。

3.1、2-3-4树名字的含义


2-3-4树中的2、3、4的含义指的是一个节点可能含有的子节点数。对非子叶节点有三种可能的情况: 
       · 有一个数据项的节点总是有两个子节点 
       · 有两个数据项的节点总是有三个子节点 
       · 有三个数据项的节点重是有四个子节点 
       上述的重要的关系决定了2-3-4树的结构,比较而言,叶节点没有子节点,然而他可能还有一个、两个、三个数据项。空节点是不会存在的。在2-3-4树中不允许只有一个连接。有一个数据项的节点必须总是保持两个连接,除非它是叶节点,在那种情况下没有连接。

3.2、2-3-4树的组织


为了方便起见,用从 0 到 2 的数据给数据项编号,用 0 到 3 给子节点编号,从左到右升序。 
       树结构中很重要的一点就是它的链与自己的数据项的关键字值之间的关系。2-3-4树中的规则和二叉树的规则大体一样,但是还加上了以下几点:下面的情况指的是有三个数据项且有四个子节点的情况: 
       · 根是 child0 的子树的所有子节点的关键字值小于key0; 
       · 根是 child1 的子树的所有子节点的关键字值大于key0并且小于key1; 
       · 根是 child2 的子树的所有子节点的关键字值大于key1并且小于key2; 
       · 根是 child3 的子树的所有子节点的关键字值大于key2。

3.3、2-3-4树的查找


       查找特定的关键字值的数据项和在二叉树中的搜索例程很类似。从根开始,除非要查找的关键字值就是根,否则选择关键字值所在的合适范围,转向那个方向,知道找到为止。

最多做树的高度次查找即可

3.4、2-3-4树插入数据


新的数据项插入总是在叶节点里,在树的最底层。如果插入到有子节点的节点里,子节点的编号就要发生变·化以此来保持树的结构,这保证了节点的子节点比数据项多1。


2-3-4树中插入节点都是从查找适当的叶节点开始的。一般有两种情况: 
(1)查找时没有碰到满节点时,插入很简单。找到合适的叶节点后,只要把新数据项插入进去就可以了。如上面插入B,X 
(2)如果插入节点已经满了,插入可能会涉及到在一个节点中移动一个或者两个其他的数据项,这样才能保证在新数据项插入后关键值仍保持正确的顺序。这就涉及到节点大的分裂。正是这种分裂的过程保证了树的平衡。 如上面插入H的时候。

3.4.1、节点分裂:

把要分裂节点中的数据项设为A、B、C,下面时分裂时的情况。(假设要分裂的节点不是根) 
要进行下面的步骤: 
       · 创建一个新的空节点,它是要分裂节点的兄弟,在要分裂节点的右边 
       · 数据项C移到新节点中 
       · 数据项B移到要分裂节点的父节点中 
       · 数据项A保留在原来的位置 
       · 最右边的两个子节点从要分裂处断节点处断开,连到新节点上 

3.4.2、根的分裂

如果一开始查找插入点时就碰到满的根时,插入过程更加复杂一点: 
       · 创建新的根,它是要分裂节点的父节点 
       · 创建第二个新节点,它是要分裂节点的兄弟节点 
       · 数据项C移到新的兄弟节点中 
       · 数据项B移到新的根节点中 
       · 数据项A保留在原来的位置上 
       · 要分裂节点的最右边的两个子节点断开连接,连到新的兄弟节点中 

 

3.5、删除操作

(1)如果2-3-4树中不存在当前需要删除的key,则删除失败。

(2)如果当前需要删除的key不位于叶子节点上,则用后继key覆盖,然后在它后继key所在的子支中删除该后继key。

(3)如果当前需要删除的key位于叶子节点上:

       (3.1)该节点不是2节点,删除key,结束

       (3.2)该节点是2节点,删除该节点:

              (3.2.1)如果兄弟节点不是2节点,则父节点中的key下移到该节点,兄弟节点中的一个key上移

             (3.2.2)如果兄弟节点是2节点,父节点是个3节点或4节点,父节点中的key与兄弟节点合并

             (3.2.3)如果兄弟节点是2节点,父节点是个2节点,父节点中的key与兄弟节点中的key合并,形成一个3节点,把此节点看成当前节点(此节点实际上是下一层的节点),重复步骤3.2.1到3.2.3

   如果是在2节点(叶子节点)中进行删除,每次删除会减少一个分支,如果删除操作导致根节点参与合并,则2-3-4树会降低一层。

image


image

image


image


image

4、从2-3-4树到红黑树

2-3-4树的分裂和红黑树的插入是完全一致的

将已知的节点都涂成黑色,对于其中的三个节点FGJ,将中间G提上去,这时多了G到F,G到J,将这些新增的涂成红色

这样新的到的一个二叉树有红色黑色的就是红黑树

对于得到的2-3-4树,通过三条规则可以把2-3-4树转化为红黑树 

2-3-4树和红黑树的等价关系

如果一棵树满足红黑树,把红结点收缩到其父结点,就变成了2-3-4树,所有红色节点都与其父节点构成3或4节点,其它节点为2节点。图中NIL节点未画出。

image_thumb53

所以红黑树的每一类型操作都与2-3-4树一一对应。黑色节点的个数(或者说位置)对应2-3-4树中的节点个数(或者说位置),这样可以很好的理解性质3(从每个叶子到根的所有路径上不能有两个连续的红色节点)和性质5(从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点)以及根节点到任意叶子节点的路径长度,最多相差一半

同时我们还需要明白的是,一颗红黑树对应唯一形态的2-3-4树,但是一颗2-3-4树可以对应多种形态的红黑树(主要是3节点可以对应两种不同的红黑树形态),上图中的2-3-4树还可以对应下图中的红黑树。我们在后面红黑树的删除操作中会利用这种情况。

image_thumb54

5、红黑树的定义

2-3-4树和红黑树是完全等价的,由于绝大多数编程语言直接实现2-3-4树会非常繁琐,所以一般是通过实现红黑树来实现替代2-3-4树,而红黑树本也同样保证在O(lgn)的时间内完成查找、插入和删除操作。

红黑树是每个节点都带有颜色属性的平衡二叉查找树 ,颜色为红色或黑色。除了二叉查找树一般要求以外,对于任何有效的红黑树我们增加了如下的额外要求:

(1) 节点是要么红色或要么是黑色。

(2) 根一定是黑色节点。

(3) 每个叶子结点都带有两个空的黑色结点(称之为NIL节点,它又被称为黑哨兵)。

(4) 每个红色节点的两个子节点都是黑色(或者说从每个叶子到根的所有路径上不能有两个连续的红色节点)。

(5) 从任一节点到它所能到达得叶子节点的所有简单路径都包含相同数目的黑色节点。

这些性质保证了根节点到任意叶子节点的路径长度,最多相差一半(因为路径上的黑色节点相等,差别只是不能相邻的红色节点个数),所以红黑树是一个基本平衡的二叉搜索树,它没有AVL树那么绝对平衡,但是同样的关键字组成的红黑树相比AVL旋转操作要少,而且删除操作也比AVL树效率更高,实际应用效果也比AVL树更出众。当然红黑树的具体实现也复杂的多。

image_thumb55

红黑树的这5个性质中,第3点是比较难理解的,但它却非常有必要。我们看上面这张图,如果不使用黑哨兵,它完全满足红黑树性质,根结点5到两个叶结点1和叶结点9路径上的黑色结点数都为3个,且没有连续红色节点。

但如果加入黑哨兵后,叶结点的个数变为8个黑哨兵,根结点5到这8个叶结点路径上的黑高度就不一样了,所以它并不是一棵红黑树。NIL节点的存在还可以使得红黑树在代码实现方面得到简化,在具体实现过程中我们只需要1个NIL节点即可,详情请关注本博客的下一篇文章,有关红黑树代码的实现。

image_thumb52

红黑树的所有性质其实都可以从2-3-4树来理解,这也是理解红黑树最好的方式,因为红黑树本质就是2-3-4树。

https://blog.csdn.net/v_july_v/article/details/6109153

https://blog.csdn.net/v_july_v/article/details/6530142

6、2-3-4树的效率

2-3-4树中增加每一个节点的数据项数量可以抵偿树的高度的减少。

2-3-4树中的查找时间与平衡二叉树如红黑树大概相等,都是O(logN).

7、待补充

猜你喜欢

转载自blog.csdn.net/u014028063/article/details/83095951