上一篇总结中二叉查找树支持快速查找,删除以及插入操作,时间复杂度与树的高度成正比,理想情况下是 O(logn)。
但是在频繁插入删除的情况下,树的高度可能就大于 log2|n。极端情况下,树可以退化成链表这种结构,那么相应的操作效率也就下降了。
针对这种情况,为了保持二叉查找树的执行效率高效,出现了平衡二叉查找树,其中最广为人知的就是红黑树。
什么是平衡二叉查找树
二叉树中任意节点的左右子树的高度相差不超过 1。完全二叉树,满二叉树都是平衡二叉树。
举例如下:
平衡二叉查找树不仅满足平衡二叉树的特点,也满足二叉查找树的特点。最先被发明的平衡二叉查找树就是 AVL树。
但是,很多平衡二叉查找树并没有严格的遵守平衡二叉树的定义。比如红黑树,从根节点到叶子节点的最长路径可能是最短路径的二倍。
对于平衡二叉查找树的理解,王争老师给出了下面的解释:平衡二叉查找树的出现,就是为了解决二叉查找树频繁删除插入操作,出现时间复杂度退化的问题,所以,平衡二叉查找树只要保证树看起来相对平衡,相对对称,数的高度不大于 log2|n 就可以称之为平衡二叉查找树。如此,查找删除以及插入操作是效率就会高一些。
定义一个平衡二叉查找树
Splay Tree(伸展树),Treap(树堆) 都是平衡二叉查找树,接下来总结一个常见的平衡二叉查找树:红黑树。
红黑树是一种不严格的平衡二叉查找树,在树分为红色节点和黑色节点。红黑树还需要满足以下几点:
1:根节点是黑色的。
2:每个叶子节点都是黑色的空节点,叶子节点不存值。
3:任何相邻的节点都不能是红色节点,红色节点被黑色节点隔开。
4:每个节点,从该节点到可达节点经过的黑色节点个数相同。
图例如下:
红黑树高度分析
首先,将红黑树中的红色节点去除,那么它们的子节点就没有父节点了,我们将这些子节点指向它们的父节点。之前的二叉树就变成了四叉树,图例如下:
从四叉树中取出两个节点,放在叶子节点位置,这棵树就变成了完全二叉树,它的高度就是近似 log2|n。四叉树要比这个完全二叉树低,所以四叉树的高度肯定不会高于 log2|n。
现在,将红色节点加到四叉树中。由于红色节点必须被黑色节点隔开,所以一个红色节点最少对应一个黑色节点。那么单纯只有黑色节点的二叉树高度不会高于 log2|n,那么加入红色节点后,树的高度不会高于 2log2|n。所以,红黑树的高度近似 2log2|n。
对比高度平衡的 AVL树的高度,红黑树的高度顶多是它的二倍,性能上下降的不多。实际中,红黑树的效率要高于 AVL树。
总结
红黑树是一种最难掌握的数据结构,更难的是它的实现。但是王争老师一直给我们普及一种观念:我们学习数据结构和算法,主要是学习它的特性,由来以及实适用的场景和它能解决的问题。对于红黑树,只要掌握了这些就足够了。
本文创作灵感来源于 极客时间 王争老师的《数据结构与算法之美》课程,通过课后反思以及借鉴各位学友的发言总结,现整理出自己的知识架构,以便日后温故知新,查漏补缺。
初入算法学习,必是步履蹒跚,一路磕磕绊绊跌跌撞撞。看不懂别慌,也别忙着总结,先读五遍文章先,无他,唯手熟尔~
与诸君共勉