红黑树
,非常经典的数据结构,主要用于一些容器中,比如C++
语言中的map
、Java
语言中的TreeMap
(后面会写源码分析博客)。红黑树
能保持高效的查找,一般取时间复杂度为O(log2n),由于高效,这个结构也比较复杂,所以很多人(包括我自己)都一直搞不懂红黑树
到底是怎么插入
、删除
节点的。此篇博客,博主将图文并茂的一层一层揭开红黑树
神秘面纱。
温 馨 提 示 : \color{red}温馨提示: 温馨提示:要彻底搞懂红黑树
,难度还是比较大的,建议先阅读我之前写的两篇博客做铺垫,数据结构之二叉树、AVL树、红黑树、Trie树、B树、B+树、B*树浅析是通识篇,主要介绍了几种树结构的区别,数据结构之二叉搜索树详解(附C++代码实现查找、插入、删除操作)单独介绍二叉搜索树
插入、删除操作。(其实红黑树
= 二叉搜索树
+ 弱平衡
)
阅 读 博 客 时 , 建 议 准 备 笔 和 纸 , 手 动 画 一 画 , 并 且 步 步 为 营 , 不 要 跳 着 看 ! \color{red}阅读博客时,建议准备笔和纸,手动画一画,并且步步为营,不要跳着看! 阅读博客时,建议准备笔和纸,手动画一画,并且步步为营,不要跳着看!
一、红黑树
概述
1、什么是红黑树
?
红黑树
是一棵二叉搜索树
,并且这棵树实现了弱平衡
(严格的平衡是对于树中任意节点的左右子树高度差不超过1)。弱平衡
是指任意节点到到其子树中的叶节点
所经过的黑色节点
数相同,也可以称为黑色平衡
(因为严格平衡的二叉搜索树AVL,维护成本太高,所以退而求其次)。
2、红黑树
的五大特性
红黑树
的五大特性:
1、节点是红色或者是黑色
2、根节点是黑色
3、每个叶节点(NIL或空节点)是黑色
4、每个红色节点的两个子节点都是黑色的
5、任意节点到其子树中的叶节点(NIL节点)所经过的黑色节点数相同(黑高相同)
注 : \color{red}注: 注:红黑树
引入了NIL
节点,用于填充节点的左或右为空的位置,因此红黑树
中的叶节点
特指NIL
节点。
一说定义,博客的画风瞬间变得枯燥起来了,可能有些小伙伴已经开始有抵触情绪的。这些特征你可以不用记住,后面用到的时候我会反复提出来的。
3、为什么要引入红黑树
还记不记得在博客