zoukankan      html  css  js  c++  java
  • 【Java深入研究】10、红黑树

    一、红黑树介绍

    红黑树是二叉查找树,红黑树的时间复杂度为: O(lgn)

    红黑树的特性:
    (1)每个节点或者是黑色,或者是红色。
    (2)根节点是黑色。
    (3)每个叶子节点(NIL)是黑色。 [注意:这里叶子节点,是指为空(NIL或NULL)的叶子节点!]
    (4)每个红色结点必须有两个黑色的子结点

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

    红黑树的应用比较广泛,主要是用它来存储有序的数据,它的时间复杂度是O(lgn),效率非常之高。
    例如,Java集合中的TreeSetTreeMap,C++ STL中的set、map,以及nginx、Linux虚拟内存的管理,都是通过红黑树去实现的。

    二、红黑树操作

    1、左旋 和 右旋

    在对红黑树进行添加或删除之后,红黑树就发生了变化,可能不满足红黑树的5条性质,也就不再是一颗红黑树了,而是一颗普通的树。而通过旋转,可以使这颗树重新成为红黑树。简单点说,旋转的目的是让树保持红黑树的特性。旋转包括两种:左旋 和 右旋

    旋转之后,仍然是二叉排序树

    2、添加

    首先,将红黑树当作一颗二叉查找树,将节点插入;然后,将节点着色为红色;最后,通过旋转和重新着色等方法来修正该树,使之重新成为一颗红黑树。

    详细步骤

    • 第一步: 将红黑树当作一颗二叉查找树,将节点插入。
    • 将插入的节点着色为"红色"(为了不违背第五条特性)
    • 当被插入的节点的父节点是红色,通过一系列的旋转或着色等操作,使之重新成为一颗红黑树。

    3、删除

    将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。详细描述如下:

    • 如果删除的是叶节点,可以直接删除
    • 如果被删除的元素有一个子节点,可以将子节点直接移到被删除元素的位置
    • 如果有两个子节点,这时候就可以把被删除元素的右支的最小节点(被删除元素右支的最左边的节点)和被删除元素互换,我们把被删除元素右支的最左边的节点称之为后继节点(后继元素)
    • 当被删除元素(交换之后的元素)为黑,且有一个右子节点为红时,将右子节点涂黑放到被删除元素的位置

    三、和AVL树比较

    1、AVL树是最先发明的自平衡二叉查找树。一棵AVL树满足以下的条件

    • 它的左子树和右子树都是AVL树 
    • 左子树和右子树的高度差不能超过1 
    AVL的结构相较RB-Tree来说更为平衡,在插入和删除node更容易引起Tree的unbalance,因此在大量数据需要插入或者删除时,AVL需要rebalance的频率会更高。因此,RB-Tree在需要大量插入和删除node的场景下,效率更高。自然,由于AVL高度平衡,因此AVL的search效率更高。综合来说,RB-tree的统计性能是高于AVL的。

    参考文章:

    https://www.cnblogs.com/George1994/p/6903437.html

    https://blog.csdn.net/sun_tttt/article/details/65445754

    https://www.zhihu.com/question/20545708

  • 相关阅读:
    Linux任务前后台的切换
    如何给html元素的onclick事件传递参数即如何获取html标签的data
    关键词多空格处理
    tp3常量
    php 正则判断是否是手机号码
    thinkphp 初始化
    删除图标
    time() 在thinkphp 3.2.3 模板格式化输出
    iOS工程如何支持64-bit
    调试instruments
  • 原文地址:https://www.cnblogs.com/wangzhongqiu/p/8982790.html
Copyright © 2011-2022 走看看