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

    emmmm,这东西看了我一天多,终于有一个大概的概念了

    红黑树是一种特殊的二叉搜索树

    它可以保证,无论以什么样的顺序进行插入和删除,二叉搜索树的树高均为lg(n)

    首先红黑树继承了所有二叉搜索树的性质

    红黑树接着还有另外五个性质,这些性质满足了树高为lg(n)的特性

    除了树中的节点,我们会在每个叶子节点后加两个黑色的空节点

    旋转:

    对于节点x的左旋就是把x与x的左儿子互换位置,并保证二叉搜索树的性质不变

    右旋同理

    插入:

    首先,按二叉搜索树的方法进行插入

    然后把插入的节点涂成红色

    接着通过一系列染色,旋转等操作保证这棵树满足红黑树的性质

    删除:

    首先,按二叉搜索树的方法进行删除

    我们知道,删除有三种情况

    若x为根节点直接删除,此时无论x为红或黑,均不影响性质

    若x有一支,若x为红,无影响,否则此支的黑高会少一

    若x有两支,我们找到该替换他的那一个y然后用y的值代替x的值,并删除y

    那么第三种情况就转换为前两种情况了

    在删除之后,我们在通过一系列操作来使这棵树的性质恢复

    可以看见,无论是插入还是删除,我们都是对红黑树的叶子节点,或者只有一支的节点进行操作的

    也就是说在树的下面进行操作

    想一下,对于一个二插搜索树,我要尽量保证每一个节点的两边节点数量均衡

    我们仔细的看下左旋的右旋的图片

    如果x是根节点

    那么左旋的话左子树的高度+1,右子树的高度-1

    啧啧,是不是有点看明白了

    对于插入和删除我通过红黑树的操作不断地把异常节点上移,最后通过对根节点的操作调节左右子树的高度,搞定

    ps:  发明红黑树的这人一定是个天才

  • 相关阅读:
    异常日志以及非异常日志记录方法
    oracle 监测数据库是否存在指定字段
    listview禁止双击一条之后选中复选框按钮的方法
    oracle 的rowid和rownum
    修改文件的名字的写法
    使用C#读取XML节点,修改XML节点
    BZOJ 1004: [HNOI2008]Cards
    P5022 旅行 (NOIP2018)
    P5021 赛道修建 (NOIP2018)
    P5020 货币系统 (NOIP2018)
  • 原文地址:https://www.cnblogs.com/shensobaolibin/p/8094297.html
Copyright © 2011-2022 走看看