前言
红黑树
在讲红黑树之前,我们需要先了解几种树:二叉树,二叉查找树以及平衡二叉树。
二叉树
最多有 2 个孩子的树称为二叉树。由于二叉树中的每个元素只能有 2 个孩子,我们通常将它们命名为左孩子和右孩子。
- 示意:
5
/ \
2 3
复制代码
- 代码定义:
class Node {
T data;
Node left;
Node right;
}
复制代码
二叉查找树
二叉查找树(Binary Search Tree,简称BST),(又:二叉搜索树,二叉排序树) 它是一种基于节点的二叉树数据结构,具有以下特性:
- 节点的左子树仅包含值小于节点值的节点。
- 节点的右子树仅包含值大于节点值的节点。
- 左右子树也必须是二叉查找树。
- 示意:
5 / \ 2 6 / \ 1 3 \ 4 复制代码
一颗平衡的 BST 查找效率很高,原理就是二分查找,二分查找的时间复杂度为 O(log n)。
二叉查找树退化成链表
当我们插入一组元素正好是有序的时候,这时会让排序二叉树退化成链表。如下所示:
1
\
2
\
3
\
4
复制代码
这样排序二叉树退化成链表结构,那么检索效率就变成了线性的 O(n) 的,相对来说,检索效率肯定是要差不少的。
平衡二叉树
平衡二叉树 (AVL) 树是一种自平衡二叉查找树 (BST),并且其中所有节点的左右子树的高度差不能超过 1。
平衡二叉树在二叉查找树的基础上多了一个特性:所有节点的左右子树的高度差不能超过 ;从而实现自平衡。
AVL树示意:
13
/ \
8 18
/ \ \
6 10 20
/
4
复制代码
大多数 BST 操作(例如,搜索、最大、最小、插入、删除等)花费 O(h) 时间,其中 h 是 BST 的高度。对于偏斜二叉树,这些操作的成本可能变为 O(n)。如果我们确保每次插入和删除后树的高度都保持 O(Logn),那么我们可以保证所有这些操作的上限为 O(Logn)。AVL 树的高度始终为 O(Logn),其中 n 是树中的节点数。
红黑树
- 介绍:
红黑树是一种自平衡二叉搜索树,每个节点都有一个额外的位置用来存储节点的颜色(红色或黑色)。这些颜色用于确保树在插入和删除过程中保持平衡。虽然树的平衡性并不完美,但足以减少搜索时间并保持在 O(log n) 时间左右,其中 n 是树中元素的总数。红黑树是由鲁道夫·拜耳 (Rudolf Bayer) 于 1972 年发明的。
其实红黑树和上面的平衡二叉树类似,本质上都是为了解决排序二叉树在极端情况下退化成链表导致检索效率大大降低的问题。
红黑树的特性
- 每个节点要么是红色,要么是黑色。
- 根节点永远是黑色的。
- 所有的叶子节点都是空节点(即null),并且是黑色的。
- 没有两个相邻的红色节点(红色节点不能有红色父节点或红色子节点)。
- 从任一节点到其子树中每个叶子节点的路径都包含