什么是平衡二叉查找树
我们之前依次讲了,树,二叉树,二叉查找树,二叉查找树非常常用,支持快速查找,删除,插入,理想的时间复杂度为O(logn),但是如果频繁插入删除,会导致左右子树的分布不均衡,极端情况下退化成链表,时间复杂度退化成O(n),这个时候我们就需要设计一种平衡二叉查找树,解决时间复杂度退化问题
平衡二叉树的严格定义:二叉树中任意一个节点的左右子树盖度相差不能大于1,所以满二叉树和完全二叉树都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树
平衡二叉查找树:他不仅满足上方的平衡二叉树的定义,还满足二叉查找树的定义,最先发明的平衡二叉查找树是AVL树,他严格符合平衡二叉查找树的定义,但是很多平衡二叉查找树并不是严格符合定义,因为数据结构和算法是用到实际场景中的,没必要死抠定义
发明平衡二叉查找树的是为了解决,普通的二叉查找树频繁插入和删除的时候出现的复杂度退化问题
所以,平衡二叉查找树中的“平衡”,是指的让整棵树看起来比较对称,比较平衡,不要出现左子树很高,右子树很低的情况,这样就可以避免是将复杂度退化太严重的问题
所以,我们只要保证输的高度不比log2n大太多,尽管他不符合刚才的定义,但他依然是一个合格的平衡二叉查找树
红黑树
平衡二叉查找树其实有很多,但是我们平时听到的都是红黑树,甚至我们默认平衡二叉查找树就是红黑树。
红黑树的英文是“Red-Black Tree”,简称R-B Tree,他是一种不严格的平衡二叉查找树,那么他的定义是什么
红黑树定义
红黑树中的节点,一类被标记为红色,一类被标记为黑色,一个红黑树还需要满足以下几点
1 根节点是黑色的
2 每个叶子节点都是黑色的空节点,也就是说,叶子节点不储存数据
3 任何相邻的节点,不能同时为红色,也就是说,红色节点是被黑色节点隔开的
4 每个节点,从该节点到达其可达的叶子节点的所有路径,都包括为相同数目的黑色节点
如下图:
为什么说红黑树是近似平衡
一个平衡的满二叉树高度为logn,我们只需要证明红黑树的高度趋近于logn就可以了
首先我们先把红色的节点从红黑树中去掉红色的节点,那单纯的黑色节点的树是多高呢?
红色删除后,有些节点就没有了父节点,他就会那这些节点的祖父节点作为父节点,所以之前的二叉树变成了四叉树
因为红黑树有一条定义,从任意节点到可达叶子节点的每条路径包含相同的黑节点数,这样的话,我们从四叉树,取出一些节点放到叶子节点上,四叉树就会变成完全二叉树,所以相同个数的四叉树比完全二叉树的高度要低
而完全二叉树的高度为log2n,四叉树的高度低于log2n
我们现在知道了只包含黑色节点的高度,那么加上红色节点的后高度是多少呢?
因为红黑树有一条定义,相邻俩个节点不能同时为红色节点,也就是说一个红色节点就有一个黑色节点,所以加上红色节点后的高度小于2*log2n
也就是说红黑树的高度近似2log2n,趋近于logn
红黑树通过左旋和右旋的方式,保证树的平衡