【数据结构】——6.5 红黑树
没有学过二叉搜索树(也叫二叉排序树或二叉查找树)的小伙伴们建议先学习一下,这样阅读会更轻松哦 点我学习二叉搜索树
目录
一、红黑树的概念和性质
红黑树是一种近似平衡的二叉搜索树,它有以下特点:
- 每个节点只能是红色或黑色
- 根节点为黑色
- 红色节点的两个孩子必须是黑色
- 对于每个节点,到所有叶子节点的路径中,经过的黑色节点数目是相同的。
- 叶子节点的两个空指针孩子当作黑节点来看,它被称为
NIL节点,在使用时我们也可以忽略它的存在。

红黑树这些规则有什么用呢?
- 因为红色节点的孩子必须是黑色的,所以不可能存在2个连续的红色节点
- 因为每个节点到低的每条路径黑色数目相同,且不存在2个连续的的红色节点,所以一条路径最短的情况是每个节点都是黑色节点,最长的情况是一黑一红相间的路径。
- 因此最长的路径一定不会超过最短路径节点数的2倍,这保证了红黑树不会出现单支树的问题,在一定程度上确保了二叉搜索树的平衡性。
红黑树的最优情况:全为黑色节点或每条路径都是一黑一红
红黑树的最差情况:左子树全黑,右子树一黑一红
红黑树是一个近似平衡的搜索二叉树,它确保了没有一条路径会比其他路径长出2倍,解决了普通二叉搜索树因不平衡导致查找效率低的问题。

AVL树也是一颗近似平衡的二叉搜索树,它们有什么区别?
- AVL树中左子树与右子树的高度差不能超过1,红黑树中最长路径不会超过最短路径的2倍。所以从平衡性来讲,AVL树比红黑树更加接近平衡,AVL树的查找效率比红黑树更高
- 当插入节点时,AVL树中平衡因子超过2就要进行旋转,而红黑树中出现连续红色节点时才会旋转。这是红黑树的旋转次数比AVL树少,因此红黑树的插入效率比AVL树更高。同理,删除效率也比AVL树更高
虽然选择二叉搜索树作为数据结构去使用是因为它高效率的查找效率,但是在我们经常使用的一些容器中,插入和删除也是我们频繁使用的接口,因此在实际应用中,红黑树的应用比AVL树更广泛。但是对于一些特定场合,使用AVL树也是更不错的选择。
二、红黑树的存储结构和声明
- 红黑树的结构依然使用三叉链表来实现
- 我们使用
enum枚举类型来定义节点的红色和黑色 - 我们只实现红黑树的插入,查找和中序遍历,并且提供一个函数检测我们的红黑树是否满足规则
namespace Name
{
// 颜色定义
enum Color
{
RED,
BLACK
};
// 节点声明
template <class K>
struct RBTreeNode
{
K& _key; // 键
RBTreeNode<K> *_left;
RBTreeNode<K> *_right;
RBTreeNode<K> *_parent;
Color _col; // 颜色
// 构造函数
RBTreeNode(const K& key)
: _key(key)
, _left(nullptr)
, _right(nullptr)
, _parent(nullptr)
, _col(RED)
{
;
}
};
// 红黑树的声明
template <class K>
class RBTree
{
typedef RBTreeNode<K> Node; // 将节点类型重命名为Node
public:
bool Insert(const K& key); // 插入
bool Find(const K& key); // 查找
void InOrder(void); // 中序遍历
bool IsBalance(void); // 检测是否满足红黑树规则
private:
Node* _root; // 根节点指针
};
}
三、红黑树的构建过程
红黑树通过不断插入元素,构成二叉搜索树,若是破坏了红黑树的规则,则对树进行调整,直到构成红黑树
插入的新节点该是什么颜色呢?
新创建的节点一定是红色,因为新节点是黑色会导致本条路径的黑色节点数量多出一个,破坏红黑树的规则。
插入步骤:
最低0.47元/天 解锁文章
313

被折叠的 条评论
为什么被折叠?



