• 理解红黑树


    以下全是根据视频学习后的个人理解和笔记。。。视频链接

    红黑树可以理解为由234树演变而来,234树是由二叉查找树演变而来,二叉查找树由二叉树演变来,所以想要了解红黑树要了解二叉树和234树

    二叉树

    二叉树:即每个子节点只有两个节点的树
    二叉查找树:也是一个二叉树,只不过二叉查找树的左节点都比其父节点小,右节点都比父节点大。其高度决定了他的效率
    二叉查找树的效率也与插入顺序有关如:
    插入顺序为 5、3 、2、4、7、6、8,可以如下所示
    在这里插入图片描述
    但是若插入顺序为 2、3、4、5、6、7、8,则是如下所示
    在这里插入图片描述

    插入的顺序决定了其深度,而深度又决定了查找的效率。(可以将所有的节点投影到X轴上会发现其已经是顺序排列(即将树压平),如下:)
    在这里插入图片描述

    ①查询:查找的时候从根节点开始,当前节点比查找的值小就向右搜索,比查找的值大就向左搜索
    ②插入:插入的时候也是,从根节点开始与左右子树进行比较,当左子树或右子树为空的时候插入到对应的空位置
    ③遍历:即左根右(前序遍历)、根左右(中序遍历,常用)、左右根(后序遍历)
    前驱节点:当前节点左子树中的最大值
    后驱节点:当前节点右子树中的最小值
    如上图1所示,5的前驱节点是4,后驱节点是6
    ④删除:删除当前节点的话则使用该节点的前驱节点或者后驱节点代替(即将树压平后该节点相邻的节点)。若没有前驱节点和后驱节点直接删除即可

    avl树

    由上述的二叉查找树可知,其插入顺序不一样会导致其查找效率不同。最坏的情况下相当于一个链表。
    基于该问题,出现了平衡查找二叉树,平衡树插入和删除的时候,会通过旋转来将高度保持在LogN。其中具有代表性的平衡树有avl树和红黑树
    avl树 是高度平衡树,具备二叉搜索树的全部性质,其左右子树的高度差不超过 1 .
    ①如何旋转:当左右子树高度差高过一的时候进行左旋或者右旋,如下所示

    旋转前
    在这里插入图片描述
    右旋后
    在这里插入图片描述
    旋转前

    在这里插入图片描述
    右旋后
    在这里插入图片描述

    2-3-4树

    2-3-4树是四阶的B树,(即最多有四个子节点),属于一种多路查找树.
    其所有的叶子结点都拥有相同的深度.节点只能是2节点,3节点,4节点之一
    2节点:包含一个元素的节点,有两个子节点.
    在这里插入图片描述

    3节点:包含两个元素的节点.有三个子节点
    在这里插入图片描述

    4节点:包含三个元素的节点,有四个子节点
    在这里插入图片描述
    所有节点至少必须包含一个元素

    二三四树保持着二叉查找树的性质,但是其用代码实现起来不方便,所以一般使用它同等的红黑树
    典型的2-3-4树,如下所示
    在这里插入图片描述
    二三四树的插入和二叉查找树不同(二叉查找树是从顶部向下插入),二三四树是从底部向上插入.他会先满足四节点,再向三节点和二节点演化.
    如:插入过程如下:
    先插入2
    在这里插入图片描述
    再插入 3
    在这里插入图片描述

    再插入 4
    在这里插入图片描述
    这时候的 2,3,4已经满足了四节点
    再插入5
    由于当前已经满足四节点所以再次插入的时候会将以前的四节点从中间拆散,中间的数向上提,插入的数和并起来,如下图所示
    在这里插入图片描述
    再插入 6 , 现在会先根据二叉查找树的性质,即左子树小于当前节点,右子树大于当前节点,找到合适的位置后插入,如下
    在这里插入图片描述
    再插入 7 ,过程如下
    在这里插入图片描述
    再插入 8
    在这里插入图片描述
    再插入 9
    在这里插入图片描述
    再插入10
    在这里插入图片描述
    再插入 11
    在这里插入图片描述
    将其压平后
    在这里插入图片描述

    红黑树

    红黑树起源于二三四树,本质就是二三四树
    其对应关系如下所示:
    在这里插入图片描述
    概念:红黑树是一种节点带有颜色属性的二叉查找树。有如下性质

    • 节点是红色或者黑色
    • 根是黑色
    • 所有叶子节点都是黑色
    • 每个红色节点必须有两个黑色子节点
    • 从任一节点到其每个叶子节点的所有简单路径都包含相同数目的黑色节点

    常见操作

    • 变色 :节点由黑变红或者由红变黑
    • 旋转:
      1. 右旋:以某个节点A作为旋转点,A节点的左子节点变为父节点,左子节点的右子节点变为A节点的左子节点,右子节点保持不变。
        在这里插入图片描述
      2. 左旋:以某个节点A作为旋转节点,A节点的右子节点作为父节点,右子节点的左子节点变为A节点的右子节点,左子节点保持不变。(图可以看作右旋反过来即可)
    • 插入
      插入节点:
      情况以及对比2-3-4树图示:
    1. 当是第一个节点,不需要合并的时候
      在这里插入图片描述

    2. 再新增一个节点,即为两个节点的时候
      在这里插入图片描述

    3. 再新增一个节点,即为三个节点的时候
      在这里插入图片描述

    4. 再新增一个节点,即为四个节点的时候,此时需要分裂
      在这里插入图片描述

    • 删除
      删除节点

    删除节点就是将这个节点的前驱节点或者后驱节点的值赋给给节点,即替换该节点,然后再删除前驱节点或者后驱节点。

  • 相关阅读:
    Python lxml库 提取并保存网页内容部分
    存储课程学习笔记5_iouring的练习(io_uring,rust_echo_bench,fio)
    手眼标定笔记
    mysql 问题解决 3
    低代码平台选型时,要注意哪些?
    JS事件绑定
    flink state原理,TTL,状态后端,数据倾斜一文全
    Fastjson tomcat-dhcp链
    信息学奥赛一本通 1189:Pell数列
    TCP协议
  • 原文地址:https://blog.csdn.net/Badman0726/article/details/124022010