导航链接
红黑树的性质
红黑树的旋转、变色
红黑树的插入
红黑树的删除
什么是旋转?
旋转是以一个父结点作为参照物的。旋转分为左旋转与右旋转,其对应的结果就是将左子结点(后称左结点)或右子结点(后称右结点)替换原来的父结点,具体操作如下。
右旋转
:
- 使左结点成为新的父结点。
- 原来的父结点,成为新的右结点。
- 先前左结点的右子树,变成新右结点的左子树。
左旋转
则是一个相反的过程:
- 使右结点成为新的父结点。
- 原来的父结点,成为新的左结点。
- 先前右结点的左子树,变成新左结点的右子树。
旋转改变了什么?
通过上图不难看出,无论是左旋还是右旋,始终都没有改变二叉搜索树的大小排序:α < X < β < Y < γ
。变化的,仅仅是将一颗子树上的一个结点,移动到了另一棵子树上。
什么时候旋转?
当左子树树高超过右子树树高两倍的时候,进行右旋。简记:左太高,右旋。
进行右旋的场景:
当插入10
时,100
的左子树过高,于是将50
结点进行右旋转,从而降低左子树的高度。
当右子树树高超过左子树树高两倍的时候,进行左旋。简记:右太高,左旋。
进行左旋的场景:
当插入180
时,100
的右子树过高,于是将150
结点进行左旋转,从而降低右子树的高度。
什么时候变色?
当满足以下条件时:
- 当前结点是红色。
- 父结点与叔结点都是红色。
进行变色:
- 爷结点变成红色(如果是根结点,最终会变回成黑色)。
- 父结点、叔结点变成黑色。
如图,插入结点50
后,导致100
、400
都变了色。
通过变色,可以将一条路径上两个连续的红结点转成换合法结点,随之带来的影响,是需要同时改变两棵子树的高度。