3.3平衡查找树

作者: 浩林Leon | 来源:发表于2018-04-07 21:21 被阅读11次

    前面的二叉查找数已经很好的能应用在许多程序中,这次的平衡查找树不管怎么改造,他的运行时间都是对数级别的.

    3.3.1 2-3查找树

    标准的二叉树,称 2- 结点(含有一个键,两条链接) , 引入一个新的 3- 结点(含有2个键,3条链接).


    image.png
    解释:

    3-结点中, 包含两个键,E J.有3条链接,其中最左边的指向比2个键 任意键都小的,中间链接指向介于 两个键E J之间的,最右边的链接 指向比EJ 都大的结点.
    分别是对应 小 -中 -大.
    一颗完美的平衡2-3 查找树,所有的空链接到根结点的距离都是相同的.

    3.3.1.2 向2- 结点插入键.

    使用2-3 查找树的主要优点在于他能在插入后继续保持平衡.所以在2-结点后插入新键的时候,可以进行依次未命中查找,如果查找结束于一个2- 结点,就往里面插入,使之变成3-结点.如果未命中的查找结束与一个3-结点,就稍麻烦.

    3.3.1.3 向一个只含一个3- 结点树插入新键

    只有先插入,把3- 结点数 做成一个4- 结点树, 也就是包含3个键,其中有 (左<中<右) 然后把中提升为顶点,左右分别作为左子结点,右子节点.


    image.png
    3.3.1.4 向一个父节点为2-结点 的3-结点中插入一个新键.

    临时构造到4- 结点并将分解,这次不创建新的结点,而是将其后退移至他的父节点中;这样一来,他的父节点称为了3- 结点,重新调整父节点的链接,就变成了一颗完美平衡树.如下图:


    image.png
    3.3.1.5 向一个父节点 3- 结点的 3-结点插入一个新键

    步骤和前面一致,临时构造4- 结点,把他分解到父节点,父节点也是一个临时构造4-结点,分解到上一级,直到最上级是2-结点,可以把他替换成3-结点;如果一直到了根,则把根替换称3- 结点如下图:

    image.png
    3.1.1.6 分解根结点

    如果我们从插入结点到根节点都是3-结点,我们的根节点也先临时构建4- 结点,然后往上把4-结点分解称3个2- 结点,增加树的高度.这颗树任然是完美平衡树.


    image.png
    3.3.1.7 局部变换

    将一个4-结点分解称1棵2-3树可能有6中情况.
    (1) 4-结点处于根结点
    (2) 2-结点的 左结点,和
    (3)2-结点右结点
    (4) 3-结点的左结点,
    (5)3-结点中间结点,
    (6)3-结点右结点


    image.png
    3.3.1.8 全局性质

    和标准的二叉树从上至下生长不同,2-3树是由下至上生长的.
    完整的2-3树生长的过程如下图:


    image.png
    命题F:
    在一棵大小为N的2-3树中,插入和查找的时间不会超过lgN个.

    但是标准的2-3树的数据类型的转化所需要花费的开销比标准算法的二叉树还慢,平衡一颗二叉树的初衷是为了消除最坏的情况,但是我们希望这些转化保障性的代码越少越好,幸运的是采用一点代价可以使用统一的方式完成所有的变化.

    3.3.2 红黑二叉查找树

    3.3.2.1 替换3-结点

    红黑二叉树背后的基本思想是标准二叉树.用红线连接2个2-结点,替换3-结点;用黑线表示2-3树中的普通结点.对于这种表示,无需修改就可以使用标准的二叉树方法get方法.对于任意的2-3树,只要对结点进行转化就可以派生出对应的二叉查找树. 称红黑二叉查找树(简称红黑树).

    3.3.2.2 一种等价定义

    红黑树的另一种等价的定义如下:
    1.红连接均为左连接
    2.没有任何一个结点同时和两个红链接相连
    3.该树是完美黑色平衡的,即任意空链接到根节点上的黑色链接数量都是相同
    红黑树即使二叉查找树,又是2-3树;因此如果我们能保持一一对应的关系下,又能实现2-3树的插入算法,那么就可以将两者的特性结合起来:二叉搜索树的高效查找,和2-3树的高效平衡插入算法.

    3.3.2.3 增加一个颜色字段

    为了方便起见,在node 里面增加一个boolean color变量,表示从父节点链接的线条颜色,true 为红色,false 为黑色,默认空链接为黑色.为了可读性强定义 颜色常量值.private static final boolean RED=true,BLACK=false;

    3.3.2.4 旋转

    我们在操作时,有可能出现右链接,或者两两链接为红色,这个时候我们会对右链接进行调整,使之调整至左链接红色,这个过程称作左旋转.每个旋转都会返回一个链接可能是左链接,也可能是有链接;链接颜色有可能是红色也有可能是黑色,将它赋给的父节点相应的链接.这也有可能会产生两条红色链接,但是我们的算法会通过继续调用旋转修正这种情况.

    3.3.2.5旋转后重置父节点的链接

    在插入新键的操作时,我们可以使用旋转操作帮助我们保证2-3树和红黑树之间的一一对应关系,因为旋转操作可以保持红黑树的两个重要特性:有序性和完美平衡性.也就是说我们在旋转过程中不必担心达不到树的有序性和完美平衡性.

    3.3.2.6 向2-结点中插入新键

    一棵只含有一个键的红黑树只含有一个2-结点.插入另一键后马上要将他进行旋转:(为什么?因为我们定义的红黑树的性质里面任意空结点到根结点上的黑色链接数相等,所以第二个插入必须为红连接,此时的黑色链接必须为0,否则会出现两个左右子节点的空链接到根结点黑色链条数不一致) 如果插入的结点小于 根结点,向左边链一条红色链条;如果插入的数大于根节点,向右加入一条红色链条,由于我们规定只能在左结点可以存在红色链,所以需要对有节点进行左旋转.


    image.png
    3.3.2.7 向一颗双键树(即一个3-结点)中插入新键

    这种情况分为3种子情况:新键 小于3-结点的两个键,在两个键之间,大于两个键.

    相关文章

      网友评论

        本文标题:3.3平衡查找树

        本文链接:https://www.haomeiwen.com/subject/wghuhftx.html