数据结构-树的学习 顶

1. 树的分类

  1. 无序树:树中任意节点的子节点之间没有顺序关系,这种树称为无序树,也称为自由树;
  2. 有序树:树中任意节点的子节点之间有顺序关系,这种树称为有序树;
    • 二叉树:每个节点最多含有两个子树的树称为二叉树;
      • 完全二叉树:对于一颗二叉树,假设其深度为d(d>1)。除了第d层外,其它各层的节点数目均已达最大值,且第d层所有节点从左向右连续地紧密排列,这样的二叉树被称为完全二叉树;
        • 满二叉树:所有叶节点都在最底层的完全二叉树;
      • 平衡二叉树(AVL树):当且仅当任何节点的两棵子树的高度差不大于1的二叉树;
      • 排序二叉树(二叉查找树(英语:Binary Search Tree)):也称二叉搜索树、有序二叉树;
        • 红黑树(RBtree)
        • SBT
    • 霍夫曼树:带权路径最短的二叉树称为哈夫曼树或最优二叉树;
    • B树:一种对读写操作进行优化的自平衡的二叉查找树,能够保持数据有序,拥有多于两个子树。

2.AVL树

1. 参考链接

  1. 维基百科-AVL树

2. 旋转核心

  1. 在AVL树中任何节点的两个子树的高度最大差别为1
  2. 接受平衡因子-1,0,1,除此之外,均需要旋转

3. 旋转操作

假设平衡因子是左子树的高度减去右子树的高度所得到的值,又假设由于在二叉排序树上插入节点而失去平衡的最小子树根节点的指针为a(即a是离插入点最近,且平衡因子绝对值超过1的祖先节点),则失去平衡后进行的规律可归纳为下列四种情况:

  1. 单向右旋平衡处理LL:
    • 由于在*a的左子树根节点的左子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行一次右旋转操作;
  2. 单向左旋平衡处理RR:
    • 由于在*a的右子树根节点的右子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行一次左旋转操作;
  3. 双向旋转(先左后右)平衡处理LR:
    • 由于在*a的左子树根节点的右子树上插入节点,*a的平衡因子由1增至2,致使以*a为根的子树失去平衡,则需进行两次旋转(先左旋后右旋)操作。
  4. 双向旋转(先右后左)平衡处理RL:
    • 由于在*a的右子树根节点的左子树上插入节点,*a的平衡因子由-1变为-2,致使以*a为根的子树失去平衡,则需进行两次旋转(先右旋后左旋)操作
  5. 小结:
    1. LR(2)->左旋->LL(2)->右旋->至平衡(0)
    2. RR(-2)->右旋->RL(-2)->左旋->至平衡(0)

3. 红黑树

3.1 定义

首先,满足一个二叉树,其次满足5大性质,则可认为是红黑树:

  1. 节点不是红色就是黑色
  2. 根节点必须是黑颜色
  3. 所有叶子都是黑色(叶子是NIL节点)
  4. 每个红色节点必须有两个黑色的子节点(也就是说任何路径上不能有连续的红色节点)
  5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点

3.2 平衡核心

同AVL树旋转并保持其红黑树的特性。js动态演示-红黑树操作

3.3 操作核心

操作过程中始终关注以下原则:

  1. 始终保持着性质1和性质3
  2. 性质4只在增加红色节点、重绘黑色节点为红色,或做旋转时受到威胁。
  3. 性质5只在增加黑色节点、重绘红色节点为黑色,或做旋转时受到威胁。

3.4 具体操作

3.4.1 符号解释

  1. N:将要插入的节点(视为红色)
  2. P:N的父节点
  3. G:N的祖父节点
  4. U:N的叔父节点
  5. LR:父节点P是祖父节点G的左子节点且新节点N是其父节点P的右子节点
  6. LL:父节点P是祖父节点G的左子节点且新节点N是其父节点P的左子节点
  7. RL:父节点P是祖父节点G的右子节点且新节点N是其父节点P的左子节点
  8. RR:父节点P是祖父节点G的右子节点且新节点N是其父节点P的右子节点

3.4.2 插入时分情况具体操作:

  1. 新节点N位于树的根上,没有父节点,则可直接将其重绘为黑色;
  2. 新节点的父节点P是黑色,则直接插入,不作修改;(此处必然平衡,通过性质可证明,待写)
  3. 如果父节点P和叔父节点U二者都是红色,则将父节点P和叔父节点U修改为黑,其祖父节点修改为红,并将祖父节点视为当前节点,依情况再处理;
  4. 父节点P是红色而叔父节点U是黑色或缺少,此时,必然不平衡,需要旋转,旋转参照AVL树规则,不同之处在于重绘颜色;
    • LR:先左旋一次,转换PN角色(即将旋转下来的父节点p视为当前节点N处理),此时为LL情况;
    • LL:先重绘,将父节点P重绘为黑色,祖父节点G为红色,再右旋一次,此时将祖父节点视为当前节点处理;
    • RL:与LR对称,操作类似,只需把旋转反向
    • RR:与RR对称,操作类似,只需把旋转反向

3.4.3 删除时分情况具体操作:

3.4.3.1 删除思想

树的递归性产生了操作的递归性:如果需要删除的节点有两个儿子,那么问题可以被转化成删除另一个只有一个儿子的节点的问题 原因:在删除带有两个非叶子儿子的节点的时候,我们要么找到它左子树中的最大元素、要么找到它右子树中的最小元素,并把它的值转移到要删除的节点中。我们接着删除我们从中复制出值的那个节点,它必定有少于两个非叶子的儿子。因为只是复制了一个值,不违反任何性质,这就把问题简化为如何删除最多有一个儿子的节点的问题。

3.4.3.2 删除操作

首先字母解释

 X:最终被删除的节点(至多一个孩子节点)
 P:X的父亲节点
 N:X的孩子节点
 S:X的兄弟节点
 SL:S的左孩子
 SR:S的右孩子

此时删除操作的复杂度在于 删除节点的颜色

  1. 当X为红色时,直接拿黑色节点N代替
  2. 当X为黑色时,若N为红色时(黑+红),拿黑色N节点代替
  3. 当X为黑色时,若N为黑色时(黑+黑),此时是最复杂的,共有6种情况(以下情况均已用N节点代替X节点):
    1. X为根节点,此时,最为简单,直接用黑色N节点替换;
    2. S为红色,其他节点均为黑色(类似插入时LL操作后情况),
      • 操作:左旋,并将PS颜色互换;继续4,5,6排查
    3. 均为黑色,
      • 操作:将S节点重绘为红色,将P节点按情况1处理,继续1-6排查
    4. P为红色,其他节点均为黑色,
      • 操作:将P S节点颜色互换,完结
    5. S为黑色,S的左节点为红,右节点为黑,P可红可黑,但N为P的左孩子
      • 操作:S,Sl右旋并互换颜色,此时进入情况6
    6. S为黑色,S的左节点可红可黑,右节点为红,P可红可黑,但N为P的左孩子
      • 操作:P,S左旋并互换颜色,并将SR重绘为黑色,完结。

操作图: 《数据结构-树的学习 顶》

1. 相关连接

  1. 维基-二叉搜索树
  2. 维基-红黑树
  3. 思否-红黑树详细分析
  4. 思否-红黑树1
  5. 思否-红黑树2
    原文作者:红黑树
    原文地址: https://my.oschina.net/u/3686885/blog/1856730
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞