zoukankan      html  css  js  c++  java
  • 红黑树与平衡二叉树

    红黑树的性质

    性质1.节点是红色或黑色。

    性质2.根节点是黑色。

    性质3.每个叶子节点都是黑色的空节点(NIL节点)。

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

    性质5.从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。

    这些约束强制了红黑树的关键性质: 从根到叶子的最长的可能路径不多于最短的可能路径的两倍长。结果是这个树大致上是平衡的。因为操作比如插入、删除和查找某个值的最坏情况时间都要求与树的高度成比例,这个在高度上的理论上限允许红黑树在最坏情况下都是高效的,而不同于普通的二叉查找树。

     旋转和颜色变化规则

    1、添加的节点必须为红色

    2、变色的情况:当前结点的父亲是红色,且它的叔结点也是红色

      2.1 把父节点设置为黑色

      2.2 把叔节点设置为黑色

      2.3 把祖父节点设置为红色

      2.4 把当前指针定义到祖父节点,设为当前要操作的

    3、左旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是右子树

      3.1 以父节点作为左旋。

    4、右旋的情况:当前父节点是红色,叔节点是黑色,且当前的节点是左子树

      4.1 把父节点变成黑色

      4.2 把祖父节点变为红色

      4.3 以祖父节点右旋转

    平衡二叉树(AVL)的性质 

    它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。但是频繁旋转会使插入和删除牺牲掉O(logN)左右的时间,不过相对二叉查找树来说,时间上稳定了很多。

    区别: 

    1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。

    2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。

  • 相关阅读:
    Linux内核RPC请求过程
    二分图
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 合并石子
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 摩尔斯电码
    Java实现 蓝桥杯 算法提高 文本加密
    Java实现 蓝桥杯 算法提高 文本加密
    Java蓝桥杯 算法提高 九宫格
    Java蓝桥杯 算法提高 九宫格
  • 原文地址:https://www.cnblogs.com/ericli-ericli/p/12873061.html
Copyright © 2011-2022 走看看