1.基本概念
1.1.红黑树的引进
AVL的左右子树高度差不能超过1,每次进行插入/删除操作时,为了确保AVL树的特性,几乎都需要通过旋转操作保持平衡。在频繁进行插入/删除的场景中,频繁的旋转操作使得AVL的性能大打折扣。为了解决这个问题,引进的红黑树。
红黑树通过牺牲严格的平衡,换取插入/删除时少量的旋转操作,整体性能优于AVL
红黑树插入时的不平衡,不超过两次旋转就可以解决。删除时的不平衡,不超过三次旋转就能解决
红黑树的红黑规则。
1.2.红黑树的规则
- 节点不是红色就是黑色,根节点是黑色
- 红黑树的叶子节点并非传统的叶子节点,红黑树的叶子节点是null节点(空节点)且为黑色
- 同一路径,不存在连续的红色节点
1.3.红黑树的举例
如下图所示,这就是一颗红黑树。
2.红黑树的性质
- 节点不是黑色,就是红色(非黑即红)
- 根节点为黑色
- 叶节点为黑色(叶节点是指末梢的空节点
Nil
或Null
) - 一个节点为红色,则其两个子节点必须是黑色的(根到叶子的所有路径,不可能存在两个连续的红色节点)
- 每个节点到叶子节点的所有路径,都包含相同数目的黑色节点(相同的黑色高度)
我们需要注意的是,每一次插入操作,都默认待插入的元素节点都是红节点。
3.红黑树的操作
这幅图表示向一颗红黑树插入红节点而导致使得红黑树失衡的失衡时需要进行的转化操作。
这个表格还是非常好理解的!
这个操作过程用文字描述起来异常麻烦,建议看视频。
事实上,信息论与编码的知识告诉我:一个视频所携带的信息量远远大于一篇博客!!!
上面这个网页是视频里面提到的,这个大家可以模仿一下视频里面的内容!
4.总结
-
如果把红黑树中的所有红色节点改为黑色节点,就是一个AVL树
-
红黑树之所以可以解决AVL树频繁维护BF(平衡因子)所需要大量的资源是因为降低了平衡的要求。AVL树严格确保BF的绝对值为1,而红黑树只需要确保该节点到叶子节点的所有路径中包含黑色节点的个数相同(由于我们解决的是二叉树,所以只需要确保节点的左右子树满足这个特性就可以了)
-
红黑树的维护操作起始就是在AVL树操作的基础上进行着色,如果AVL树的操作非常熟悉,那么红黑树也就很简单了。
-
红黑树本质上还是二叉搜索树,只是为了改正AVL树的缺点而提出来的新的数据结构,不要忘记这个性质。