红黑树学习

在学习红黑树之前,先学习一下什么是二叉树

什么是二叉树?

首先树是一种抽象数据类型,用来模拟有树状结构性质的数据集合。
而二叉树指的是每个父节点最多只能有两个子节点的树形结构。

简单的二叉树

什么是二叉搜索树?

二叉搜索树要求:

  • 如果根节点的左子树不空,则左子树上的所有节点均小于根节点。
  • 如果根节点的右子树不空,则右子树上的所有节点均大于根节点。
  • 每个子节点也同样满足上面条件。
    在这里插入图片描述

二叉搜索树查找:

  • 查找值比当前值大,右节点
  • 查找值比当前值小,左节点
  • 相等,结束搜索

插入:

  • 从根节点开始插入,小于节点值则去左节点,大于节点值则右右节点,直到左节点或者右节点为空进行插入。

遍历

  • 最常见的是中序遍历。
    在这里插入图片描述

查找最大值和最小值:

  • 要找最小值,先找树的左节点,一直找到没有左节点的节点,这个节点就是最小值。最大值找右节点同理

二叉树删除

  • 该节点是叶子节点
  • 该节点有一个子节点
  • 该节点有两个子节点

1. 删除叶子节点(即没有子节点的节点)
要删除叶子节点,只需要将父节点指向该节点的引用,改为指向null即可。
在这里插入图片描述
2. 删除有一个子节点的节点

  • 删除有一个子节点的节点,只需要将其父节点的引用改为指向该节点的子节点即可。
  • 因为如果该节点是左节点,那么其子节点一定也小于父节点,如果是右节点,则其子节点一定大于父节点,因此删除之后直接修改父节点的指向即可。
    在这里插入图片描述
    3.删除有两个节点的子节点
    此时引入了一个概念:后继节点
    后继节点指的是大于此节点的最小节点。
    使用后继节点代替删除的节点之后,二叉搜索树依然是有序的。
    在这里插入图片描述

二叉搜索树的优点

  1. 查询效率较高,时间复杂度为O(logn)
  2. 相对数组来说插入数据更加灵活

二叉搜索树的缺点
在极端情况下,二叉搜索树就是一个线性链表,时间复杂度变为O(n)
在这里插入图片描述
AVL树

  • 为了解决二叉搜索树的问题,出现了AVL树.
  • AVL树具有二叉搜索树的全部特性
  • 且AVL树每个节点的左节点和右节点的高度至多相差1
    那么为什么有了AVL树还出现了红黑树呢?
    因为AVL树虽然解决了二叉搜索树极端情况下相当于线性链表的问题,但是由于其要求左子树和右子树高度只能相差1,导致几乎大部分的插入都会破坏这个平衡从而导致旋转,过于影响性能.

红黑树学习

  • 红黑树的性质:
  1. 每个节点要么是黑色,要么是红色
  2. 根节点是黑色
  3. 每个叶子节点(NIL)都是黑色
  4. 每个红色节点的两个子节点一定都是黑色,不能有两个红色节点相连.
  5. 任意一个节点到每个叶子节点的路径都包含相同数量的黑节点,俗称:黑高(黑色完美平衡)
  6. 根据性质5可以推出:如果一个节点有一个黑子节点,那么这个节点一定有两个子节点
    在这里插入图片描述

旋转

  • 左旋
    以某个节点为旋转节点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点
    在这里插入图片描述
  • 右旋
    以某个节点为旋转节点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点
    在这里插入图片描述

插入

  • 刚插入默认是什么颜色?
    首先如果默认是黑色: 如果是默认黑色那么插入的那条路径一定比其他路径多一个黑节点,就需要进行调整.
    如果是红色: 如果父节点是黑色则直接插入然后返回,如果父节点是红色则需要调整.
    所以默认插入颜色一定是红色,默认黑节点每次都需要调整成本太高了.
  • 插入节点的几种情况
    cur:插入节点
    parent:父节点
    pParent:父节点的父节点
    uncle:父节点的同级节点
  1. 红黑树为空树,直接插入成为根节点,并变色为黑色.
  2. cur为红,parent为黑,直接插入,不影响红黑树黑色完美平衡
  3. cur为红,parent为红,而parant为红则pParend必为黑
    3.1. uncle存在且为红,则将parent,uncle改为黑,pParent改为红,再将pParent作为cur继续向上调整 在这里插入图片描述
    3.2. uncle不存在或是黑色,且parent是pParent的左子节点.
    3.2.1 cur为parent的左节点.
    先变色,parent变为黑,pParent变为红,然后以pParent为支点右旋.
    在这里插入图片描述
    3.2.2. cur为parent的右节点.
    先对parent进行左旋,此时cur是parent的父节点,变色,然后对pParent进行右旋.
    在这里插入图片描述3.3 parent为pParent的右节点
    3.3.1 cur为parent的右节点,先变色,再对pParent左旋
    在这里插入图片描述
    3.3.2 cur为parent的左节点,先对p右旋,然后变色,在对pParent左旋
    在这里插入图片描述
    以上知识点的示例:在这里插入图片描述

删除

红黑树也是一颗二叉搜索树,删除节点也是3种情况.

  1. 删除的是叶子节点
  2. 删除的节点有一个子节点
  3. 删除的节点有两个子节点

而删除之后很可能会打破红黑树的平衡,我们要做的就是删除之后重新进行维护,使其能够满足红黑树的5个特性.

  1. 每个节点要么是黑色,要么是红色
  2. 根节点是黑色
  3. 每个叶子节点(NIL)都是黑色
  4. 每个红色节点的两个子节点一定都是黑色,不能有两个红色节点相连.
  5. 任意一个节点到每个叶子节点的路径都包含相同数量的黑节点,俗称:黑高(黑色完美平衡)

然后根据上面的3种删除的情况分开讨论.

  1. 删除的是叶子节点
    1.1 叶子节点是红色. -> 不需要修复,因为不会破坏红黑树的特性.
    1.2 叶子节点是黑色 -> 会破坏特性5
  2. 删除的节点(称为P) 下面有一个节点S,对于这种情况将P和S的值进行交换,就变成了删除S,S是叶子节点,这样这种情况就变成了1的情况
    2.1 P为黑,S为红,对应1.1
    2.2 P为黑或红,S为黑,对应1.2
  3. 删除的节点有两个子节点,这种情况下,通过将P和它的后继节点N的值进行交换,将删除P转换为删除后继节点N,有两种情况
    3.1 N是叶子节点,对应情况1
    3.2 N有一个子节点,对应2
    这样就把所有情况都转换成了1,而1.1不需要处理,所以只要关注1.2怎么处理就好.
    在这里插入图片描述

参考的红黑树学习资料:https://www.bilibili.com/video/BV1UJ411J7CU?p=1
红黑树删除: https://www.jianshu.com/p/84416644c080

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值