红黑树

作者: jection | 来源:发表于2018-10-30 20:10 被阅读0次

因为集合类用到了红黑树,所以,顺便学习下红黑树的原理

  • 二叉树,每个节点最多有两个子节点的树
  • 二叉查找树,可以二分查找的二叉树
  • 红黑树,是一个近似平衡的二叉查找树

二叉查找树

入门:https://www.sohu.com/a/201923614_466939
Binary Search Tree(BST)——二叉查找树具备什么特性呢?

1.左子树上所有结点的值均小于或等于它的根结点的值。

2.右子树上所有结点的值均大于或等于它的根结点的值。

3.左、右子树也分别为二叉排序树。

下图中这棵树,就是一颗典型的二叉查找树:


图片.png

二叉查找树的查找使用的是二分查找的思想,查找效率很高。
但是缺陷也很明显:
假设初始的二叉查找树只有三个节点,根节点值为9,左孩子值为8,右孩子值为12


图片.png

接下来我们依次插入如下五个节点:7,6,5,4,3。依照二叉查找树的特性,结果会变成一颗畸形的树,查找从二分查找变成了线性查找,速度会随着树的变深而变慢。


图片.png

红黑树

红黑树(Red Black Tree)是一种近似平衡的二叉查找树,它能够确保任何一个节点的左右子树的高度差不会超过二者中较低那个的1倍。

红黑树必须满足:

  1. 节点是红色或黑色。
  2. 根节点是黑色。
  3. 每个叶子节点都是黑色的空节点(NIL节点)。
  4. 每个红色节点的两个子节点都是黑色。(从每个叶子到根的所有路径上不能有两个连续的红色节点)
  5. 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
    (规则5可以推出,新插入的节点,颜色一定是红色)

当红黑树的结构发生改变时(插入、删除节点),都会进行自调整(变色 -> 左旋转 -> 变色 -> 右旋转 -> 变色),使得整颗树符合上面5个特性,也正是因为这些规则的限制,红黑树才能保持自平衡。

调整有两种方式:

  1. 颜色调整,就是改变节点的颜色(红<->黑)
  2. 旋转,包括左旋和右旋

左旋:
左旋的过程是将x的右子树绕x逆时针旋转,使得x的右子树成为x的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。


图片.png

右旋:
右旋的过程是将x的左子树绕x顺时针旋转,使得x的左子树成为x的父亲,同时修改相关节点的引用。旋转之后,二叉查找树的属性仍然满足。


图片.png

Java的TreeMap、TreeSet底层就是用红黑树实现的。在Java8中,HashMap也改造用了红黑树。

相关文章

  • 数据结构—树—红黑树

    红黑树概述 红黑树的插入 红黑树的删除

  • TreeMap

    需要先了解红黑树,这是之前分析红黑树的文章。之前在分析红黑树时,我认为红黑树=二叉查找树+红黑平衡,关于二叉查找树...

  • 数据结构与算法-AVL 红黑树

    AVL树AVL树 算法红黑树红黑树 B站

  • [转载]红黑树

    https://zhuanlan.zhihu.com/p/24367771红黑树简介红黑树插入红黑树删除

  • 拿下红黑树

    红黑树 红黑树、2-3树的简单定义: 实现红黑树的基本结构以及添加操作(维护定义,左旋、右旋、颜色反转) 红黑树与...

  • 红黑树

    啥是红黑树,红黑树 = 二叉树

  • 彻底理解红黑树(二)之 插入

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的插入情况...

  • 彻底理解红黑树(三)之 删除

    彻底理解红黑树(一)之 二叉搜索树彻底理解红黑树(二)之 插入彻底理解红黑树(三)之 删除 前言 红黑树的删除情况...

  • Golang红黑树

    红黑树 红黑树是每个节点都带有颜色属性(红色或黑色)的二叉查找树。红黑树也属于自平衡二叉查找树。 红黑树具有如下性...

  • 数据结构红黑树添加、修改原理分析

    源码分析大纲 数据结构解析 红黑树试下原理刨析 数据结构解析 1.红黑树 1.1 红黑树概念 红黑树(Red Bl...

网友评论

      本文标题:红黑树

      本文链接:https://www.haomeiwen.com/subject/dzwatqtx.html