zoukankan      html  css  js  c++  java
  • 红黑树和AVL树

    在此之前,我没有了解过红黑树以及AVL tree,真是孤陋寡闻。如果你也在学习的话,我们一起进步。

    如果,你很急,那么只看红色加粗即可。


     1.红黑树(RB-tree)

    红黑树是一种特殊的二叉搜索树,特殊在它的性质。它是SGI STL(gcc编译器使用)唯一实现的搜寻树,作为关联式容器(至少有set, map, multiset)的底部机制之用。

    性质:

    • 节点非黑即红。
    • 根节点是黑色。
    • 树尾端NULL节点,是黑色。
    • 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
    • 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
    ===》从根到叶子的最长的可能路径不多于最短的可能路径的两倍长
    (新增节点必须为红,新增节点父节点必须为黑)
     
    为什么呢?
    注意到性质4导致了路径不能有两个毗连的红色节点。最短的可能路径都是黑色节点,最长的可能路径有交替的红色和黑色节点。因为根据性质5所有最长的路径都有相同数目的黑色节点,这就表明了没有路径能多于任何其他路径的两倍长。===》此树大致上平衡的。
     
    它适合什么?
    查找 插入 删除 较多的情况(搜寻效率几乎和AVL-tree树相等)
     
    RB-tree节点结构
    1 struct __rb_tree_node_base
    2 {
    3     color_type color;//节点颜色
    4     base_ptr parent;//父节点
    5     base_ptr left;//左节点
    6     base_ptr right;//右节点
    7     ...  
    8 }

    2.AVL 树(平衡二叉搜索树)

    平衡二叉树要求很严格,它限定左右子树的高度差(绝对值)不超过1,所以他的高度会低于红黑树,我们知道,二叉树的查找复杂度与其高度密切相关(O(log2n)),所以我们就知道了:二叉平衡树适合查找。碍于它的严格限制,必须要时刻保证左右子树高度差,所以在进行插入删除操作时,旋转子树(但旋转、双旋转)就变得很麻烦。
     
    它适合什么?
    查找 较多的情况
     
    其实作为二叉搜索树的AVL和RB-tree,查找速度相当O(logn),在插入和删除上,都要进行旋转,红黑树还要进行红黑变色,统计性能红黑树要优于AVL,这也是GUN C++ 的SGI STL采用RB-tree作为map、set底层实现的主要原因。

    上面说的太浅,我的另一篇较为详细梳理红黑树STL源码的文章 https://www.cnblogs.com/yocichen/p/10913883.html,希望对你有帮助。
  • 相关阅读:
    css定位
    css盒子
    css元素分类
    Css属性
    Css基础2
    啊啊啊啊
    函数指针
    重载函数
    成员函数
    资源网站
  • 原文地址:https://www.cnblogs.com/yocichen/p/10457359.html
Copyright © 2011-2022 走看看