二叉树:
查找前驱节点:小于当前节点的最大值。 查找后继节点:大于当前节点的最小值。(注:中序排序才有前驱节点和后继节点)
二叉树的删除:
- 叶子节点直接删除,因为没有子节点。
- 只有一个子节点的用子节点替代(本质上就是找前驱节点和后继节点,左节点为前驱节点,右节点为后继节点)。
- 有两个子节点的需找到替代节点(替代节点就是前驱节点或者后继节点,两个节点都可以)。
如下图所示:如果我们要删除2节点,2节点的前驱节点为1.5后继节点为2.5,因此这两个节点均可以替代2节点。
替代之后二叉树依然有序。
AVL树:(自平衡二叉查找树):具备二叉搜索树的全部特性且左右子树高度差不超过1。
即通过左旋或者右旋的方式来控制树的平衡。
放元素进树里面若上下两个节点都不平衡,那么先旋转下面那个节点,这样上面节点数也会相应的改变。但AVL树的条件太苛刻,因为它要求左右子树高度差不超过1,因此在对1-10链表进行构建树时,我们要用到六次右旋,这样计算机很大一部分的cpu都是用在旋转上面。因此红黑树便是为了解决这个苛刻的问题而产生的。
红黑树:红黑树的平衡条件是,无论走那条线路合起来的黑节点数一定要相等。
2-3-4树:红黑树本质上来源于2-3-4树
- 所有叶子节点都拥有相同深度
- 节点只能是2节点,3节点,4节点之一
- 2节点:包含1个元素的节点,有2个子节点
- 3节点:包含2个元素的节点,有3个子节点
- 4节点:包含3个元素的节点,有4个子节点
- 元素始终保持排序顺序,整体上保持二叉查找树的性质,即父节点大于左子节点,小于右子节点;而且节点有多个元素,每个元素必须大于它左边的和左子树中的元素。
下图是一个典型的2-3-4树:
一个2-3-4树对应多个红黑树,一个红黑树只可以对应一个2-3-4树。2-3-4树所有的叶节点到根节点的层数是相同的,这个性质也对应后面的红黑树节点中黑色节点数相同,因为2-3-4树每层都对应一个黑节点。2-3-4树本体的合并原则是优先合成4节点,合成完4节点之后还有新数据的话,我们将中间节点顶上去按照中序的顺序进行拆分。具体流程图如下所示:
此时5想要合并到2,3,4中,因此需要将3顶上去,结果如下图所示:
。
再举一个例子,看下图,若想将9合并到6,7,8中,则只能先将7顶上去。7,被顶上去了之后找3,5节点寻求合并
红黑树和2-3-4树的对应关系:
2节点一定是黑节点,3节点是对应的是一上一下且上黑下红,4节点的对应关系是中间黑两边红。 因为3节点对应两种形态即左倾和右倾最终导致,一个2-3-4树对应多种红黑树。
红黑树新增都是以红色节点新增进来,对于4节点我新增进来它便开始裂变,11号节点由黑色变为红色,10号和12号节点全部由红色变为黑色,新插入的节点为红色,裂变过程的等价关系也需要注意:
如果11号节点是根节点则它将转变为黑色。
红黑树的定义
红黑树是一种结点带有颜色属性的二叉查找树(按照顺序),但它在二叉查找树之外,还有以下5大性质:
1. 节点是红色或黑色。
2. 根是黑色。
3. 所有叶子都是黑色(叶子是NIL节点,这类节点不可以忽视,否则代码会看不懂)。
4. 每个红色节点必须有两个黑色的子节点。(从每个叶子到根的所有路径上不能有两个连续的红色节
点。)
5. 从任一节点到其每个叶子的所有简单路径都包含相同数目的黑色节点(黑色平衡)。