zoukankan      html  css  js  c++  java
  • 红黑树你搞懂了没

    红黑树的定义比较简单,无非是在插入和删除的过程中自平衡规则多了一些,不过再多也只是个位数而已

    Linux虚拟内存管理,Java中的TreeMap和TreeSet,以及JDK1.8之后的HashMap也有用到红黑树数据结构


    红黑树是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。

    红黑树的特性如下:

    1.结点是红色或黑色
    2.根结点始终是黑色
    3.叶子结点(NIL 结点)都是黑色
    4.红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)
    5.从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点


    以上性质保证了红黑树在满足平衡二叉树特征的前提下,还可以做到 从根到叶子的最长路径最多不会超过最短路径的两倍 ,这主要是考虑两个极端的情况,由性质 4 和 5 我们可以知道在一棵红黑树上从根到叶子的最短路径全部由黑色结点构成,而最长结点则由红黑结点交错构成(始终按照一红一黑的顺序组织),又因为最短路径和最长路径的黑色结点数目是一致的,所以最长路径上的结点数是最短路径的两倍。

    自平衡策略
    对于一棵红黑树的操作最基本的无外乎增删改查,其中查和改都不会改变树的结构,所以与普通平衡二叉树操作无异。剩下的就是增删操作,插入和删除都会破坏树的结构,不过借助一定的平衡策略能够让树重新满足定义。

    平衡策略可以简单概括为三种: 左旋转 、 右旋转 ,以及 变色 。

    在插入或删除结点之后,只要我们沿着结点到根的路径上执行这三种操作,就可以最终让树重新满足定义。

    左旋转
    对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图:

    https://github.com/plotor/algorithm-design

    演示的网站:

    https://www.cs.usfca.edu/~galles/visualization/RedBlack.html

     再说一说二叉树

     https://www.processon.com/view/5b3b413ee4b056f7f0beae42

  • 相关阅读:
    git学习笔记
    angular自定义指令-1
    转 三范式
    CentOS 7 安装NVIDIA驱动实现修改分辨率和扩屏功能
    acm 2034
    acm 2031
    记票统计
    acm 2020 map 逆向输出
    acm 2014
    将输入的字符一个一个读入
  • 原文地址:https://www.cnblogs.com/qianjinyan/p/11151790.html
Copyright © 2011-2022 走看看