红黑树

红黑树

二叉查找树在理想情况下时间复杂度 O ( l o g n ) O(logn) O(logn)

当二叉树在频繁的动态更新过程中,会出现树的高度远大于 O ( l o g 2 n ) O(log_2n) O(log2n)

红黑树: 就是解决复杂度退化问题,我们设计一种平衡二叉树。

平衡二叉查找树

定义: 二叉树中任意一个节点的左右子树高度相差不能大于1。

完全二叉树、满二叉树都是平衡二叉树,但是非平衡二叉树也有可能是平衡二叉树。

平衡二叉查找树: 不仅满足二叉树的特点,还满足平衡二叉树的定义,任意节点的左右子树高度相差不超过1,是一种高度平衡的二叉树。

AVL 树: 任何节点的左右子树高度相差不超过1,一种高度平衡的二叉查找树。

红黑树: 并不满足左右节点高度相差一,它的根节点到各个叶子节点的最长路径,有可能比最短路径大一倍。

平衡: 就是让树的左右看起来比较对称,比较平衡,但是不要出现左子树很高、右子树很矮的情况。这样树的高度就会相对低一些。

红黑树

平衡二叉树很多:伸展树、树堆。

红黑树: 是不严格符合平衡二叉树的定义。

红黑树是近似平衡的。

红黑树节点:一类标记黑色、一类标记红色,还要满足以下条件:

  1. 根节点是黑色;
  2. 每个叶子节点都是黑的的空节点(NULL),叶子节点不存储数据;
  3. 任何相邻的节点不能同时为红色,红色节点被黑色节点隔开;
  4. 每个节点,从改节点到达其可达叶子节点的所有路径,包含相同数目的黑色节点。

叶子节点为黑色的空节点:主要为了简化红黑树代码的实现。

平衡: 性能不退化,树的高度约为 l o g 2 n log_2n log2n

近似平衡: 性能不会退化的太严重,树的高度约为 2 l o g 2 n 2log_2n 2log2n

近似平衡

img

当删除红色节点,之前的二叉树会变成四叉树。

定义4: 任意节点可到达叶子节点的路径包含相同数目的黑色节点,从四叉树中取出某些节点,放到叶子节点,四叉树就变成完全二叉树。所以仅含黑色节点的四叉树高度,比含相同节点完全二叉树高度还小。也就是黑色四叉树的高度不会超过 l o g 2 n log_2n log2n

当把红色节点加回去,会被黑色节点隔开,黑色节点路径不会超过 l o g 2 n log_2n log2n,所以加入红色节点后,最长路径不会超过 2 l o g 2 n 2log_2n 2log2n,所以红黑树的高度近似 2 l o g 2 n 2log_2n 2log2n

红黑树高度仅比高度平衡的 AVL 树高度大了一倍,但是性能上下降的并不多,这样推倒出来的结果并不准确,实际上红黑树性能更好。

红黑树的实现

一个合格的红黑树需要满足上面四个要求

在插入、删除节点的过程,第三、第四点要求可能会破坏,而平衡调整实际上就是把破坏的第三、第四点回复过来。

左旋: 围绕某个节点左旋转

右旋: 围绕某个节点右旋转

插入操作的平衡调整

规定: 插入的几点必须是红色的,二叉查找树中新插入的节点都是放在叶子节点上。关于插入操作的平衡调整,有两种情况:

  • 插入节点的父节点是黑色,那么就什么都不做,他仍然满足红黑树的定义。
  • 插入的节点是根节点,那么直接改变它的颜色,将它变成黑色。

除以上两种情况,其他情况都会违背红黑树的定义,就需要进行调整,调整的过程包含两个基础操作: 左右旋转改变颜色

关注节点: 红黑树的调整过程是一个迭代的过程,将正在处理的节点叫做关注节点。关注节点会随着不停迭代处理,而不断发生变化。最开始关注节点就是新插入的节点。

新节点插入后,为了保持树平衡,一般有下面三种情况。

删除操作的平衡调整
关注节点进行二次调整

树的选择

工程中常用的平和二叉查找树是红黑树

Treap、Splay Tree: 虽然操作效率高,但是避免不了极端情况下时间复杂度的退化。尽管出现的概率不大,但是对于单次操作时间敏感的场景,并不适用。

AVL 树: 高度平衡的二叉树,查找效率很高,但是维护高度的平衡,需要付出更多的代价。每次插入、删除都要做调整,对于有频繁插入、删除的数据结合,适用 AVL 树的代价很高。

红黑树: 只做到了近似平衡,不是严格的平衡,在维护平衡的成本上,比 AVL 树低,插入、删除等操作性能都比较稳定,为了支撑这种工业级应用,更倾向于性能稳定的平衡二叉查找树。

使用场景: 红黑树是一种近似平衡二查找树,解决普通二叉树的在数据更新过程中,复杂度退化的问题,高度近似 l o g 2 n log_2n log2n ,插入、删除、查找操作的时间复杂度都是 O ( l o g n ) O(logn) O(logn)。因为红黑树是性能非常稳定的二叉查找树,实现起来比较复杂,我们更倾向于用跳表来代替它。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值