面试必知红黑树

面试必知红黑树

一、红黑树的定义

红黑树(R-B树)是一个特殊的二叉查询树(左节点<根节点<右节点),这种树的查询效率在O(logN)的时间复杂度,红黑树具有以下几点特性:

● 每个节点要么是黑色要么是红色
● 根节点是黑色
● 每个叶子结点是黑色,并且每个null,在红黑树中的叶子节点是平时的叶子节点下的空节点,也可以说是每个叶子节点带了两个黑哨兵,如果节点只有一个左孩子,那么它的右孩子为null是一个黑哨兵,如果节点只有一个右孩子,那么它的左孩子为null是一个黑哨兵。
● 红色节点的子节点一定是黑色节点,叶子节点一定是黑色的
● 从一个节点到该节点上的所有路径上包含相同数目的黑节点。

红黑树结构图
|
|
|
|

红黑树的插入
在插入的时候,把将要插入的节点设置成红色节点,因为这样才不会影响二叉树的平衡,插入时分为两种情况。

1.父节点是黑色
这种情况不需要处理,插入时不会破坏红黑树的结构。
在这里插入图片描述

2. 父节点是红色
2.1 红父红叔
在父节点是红色的情况下,父节点的兄弟节点是红色节点,只需要将父节点和叔节点变色即可,一直向上递归变色,保证红黑树的特性不被破坏
在这里插入图片描述

红父黑叔
在红父黑叔的情况下,就需要采用左旋和右旋机制来保证红黑树的平衡。赶紧拿出小本本,之前面试被问到啥事左旋右旋,一脸懵逼,插入分为四种情况:
1.插入节点的父节点是祖左节点的左节点并且插入的位置位于左节点,进行右旋,改变了位置后,对父节点和祖节点进行变色。
在这里插入图片描述
2.插入节点的父节点是祖节点的左节点并且插入位置处于右节点,需要先进行左旋再右旋后,把新插入节点和祖节点变色。
在这里插入图片描述
3.插入节点的父节点是祖节点的右节点并且插入位置处于左节点,需要先进行一次新节点和父节点右旋,这样才能保证涉及到的四个节点能左旋 ,改变新节点和祖节点颜色即可。
在这里插入图片描述
4.插入节点的父节点是祖节点的右节点并且插入位置处于右节点,直接进行左旋,此时只需改变父节点和祖节点颜色即可。
在这里插入图片描述
记住这六种插入情况,面试就好混时间了(哈哈哈),下面介绍红黑树删除是怎么实现的。
|
|
红黑树的删除
删除一个节点分为以下三种情况:

  1. 删除的节点没有子节点,或者说删除的节点的子节点是null,可以直接删除。
  2. 删除的节点有一个子节点,需要删除当前节点,使得子节点顶替上来即可。
  3. 删除的节点有两个子节点,这种情况需要找到其后继节点,并且其后继节点一定不会有两个子节点,所以,被删除的节点在结构上最多只有一个子节点,并且是右子树,如果后继节点有左子树,那么当前节点的后继节点肯定不是最小的,在删除的时候,我们已经破坏的红黑树的特性,所以在每次删除的时候要对红黑树进行恢复操作。删除分为以下几种情况。

|
|
①被删除的节点是红色,并且为叶子节点
指被真正删除的节点,如果删除节点不是叶子节点,那么真正删除的就是其左右子树的最小值,这种情况下直接删除就可以
|
|
②被删除的节点是黑色,并且子节点是红色
删除当前节点后,其后继节点直接顶替到删除的位置

|
|
③被删除的节点是黑色,并且子节点也是黑色
这种情况子节点顶替上来后出现双黑问题,如果新删除节点位于删除节点父节点的左边时,需要进行左旋,并改变父节点和兄弟节点的颜色。

在这里插入图片描述

在这里插入图片描述

⑤删除节点的父节点是红色,新节点与兄弟节点都为黑色
如果删除节点位于父节点的左边,那么通过改变兄弟节点的颜色即可
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_30926503/article/details/107582995