红黑树
红黑树是一种特化的AVL树平衡二叉树,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目(来源百度百科)
红黑树出现的原因:
线性查找 —性能低—>二分查找— 二查叉树会出现退化成链表的问题—>出现AVL平衡二叉树—数据变化有频繁更新节点问题—>出现红黑树
特性
是一种 自平衡 的二叉树,所谓的自平衡是指在插入和删除的过程中,红黑树会采取一定的策略对树的组织形式进行调整,以尽可能的减少树的高度,从而节省查找的时间。
- 结点是红色或黑色
- 根结点始终是黑色
- 叶子结点(NIL 结点)都是黑色
- 红色结点的两个直接孩子结点都是黑色(即从叶子到根的所有路径上不存在两个连续的红色结点)
- 从任一结点到每个叶子的所有简单路径都包含相同数目的黑色结点
以上性质保证了红黑树在满足平衡二叉树特征的前提下,还可以做到 从根到叶子的最长路径最多不会超过最短路径的两倍。 左旋转
对于当前结点而言,如果右子结点为红色,左子结点为黑色,则执行左旋转,如下图:
右旋转
对于当前结点而言,如果左子、左孙子结点均为红色,则执行右旋转,如下图:
对于当前结点而言,如果左、右子结点均为红色,则执行变色,如下图:
插入操作
红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位插入点,不过红黑树约定新插入的结点一律为红色,这主要也是为了简化树的自平衡过程。
删除操作
红黑树作为平衡二叉树的一种,同样需要借助于查找操作定位删除点,在执行删除之前我们需要判断待删除结点有几个孩子结点, 如果是 2 个的话我们需要从结点的左子树中寻找值最大的结点,或者从右子树中寻找值最小的结点,并用结点值替换掉待删除结点(只要目标结点值从树上消失即可,不要纠结具体删除的是哪个结点)。这两个结点有一个共性,即最多只有一个孩子结点(因为已经是自己所处范围内的最大和最小了),此时就将需求转变成删除只有一个孩子结点的结点,相对要简单了许多。