红黑树
红黑树
只有红色和黑色节点、弱平衡的二叉查找树
红黑树的性质
- 根节点必须是黑色
- 如果当前节点是红色,其子节点必然是黑色,父子不能同为红色
- 叶子节点均是黑色
- 每条路径上的黑色节点的数量必须是一致的
PS:红黑树为什么是一颗弱平衡二叉树?
答:不能保证左子树和右子树高度差不会超过1。
红黑树的插入
问题一:插入节点颜色是默认值是红色?
答:插入节点后可能会导致树的不平衡,而且修复的代价很小,修复的方法是(调色和旋转)。
左旋转:
右旋转:
PS:其中虚线圆是指旋转后的节点,实心圆是当前位置,黑色箭头表示旋转后的位置
红黑树的插入
按照二叉搜索树的插入方法插入
当前节点的父节点为空,将颜色置为黑色,结束。
当前节点的父节点颜色是黑色,结束
当前节点的父节点颜色是红色,看叔叔节点的颜色
叔叔节点的颜色是红色
Step1:首先将父节点置为黑色
Step2:将叔叔节点染红,将祖父节点染红,然后继续检查祖父节点
Step3:重复检测
叔叔节点的颜色是黑色
三角型
举个例子:当前节点是父节点的右节点,当前节点的父节点是祖父节点的左节点(父节点左旋变成直线型),如上图所示
直线型
举个例子:当前节点是父节点的右节点,当前节点的父节点是祖父节点的右节点,如上图所示:(祖父节点进行右旋,交换祖父节点的颜色和叔叔的颜色)
举个例子:
Step1: 准备一颗红黑树
Step2: 插入一个节点 39,纠错,图中39应该是红色节点
Step3:左旋转节点38
Step4: 右旋转祖父节点40,并且交换当前节点和祖父节点的颜色,读取新的父亲节点和祖父节点继续检查。
红黑树的删除
搜索删除节点
查找替换节点
删除节点操作
删除节点有两个后代
交换替换节点和删除节点的值,对替换节点进行删除操作
删除节点无后代
1、删除节点是树根,直接删除或者替换
2、删除节点是叶节点,替换节点是NULL,
若删除节点是黑色,修复双黑
删除节点有一个后代
1、不是双黑节点,染黑替换节点即可
PS:双黑节点:替换节点和删除节点都是黑色
修改双黑问题
- 若删除节点不存在兄弟节点,需要将双黑问题传递给父亲节点,对父亲节点修复双黑问题
- 兄弟节点是红色,对父节点进行左旋,然后染红父亲节点,染黑兄弟节点,纠错图中sibling的位置标注错误,然后按照第一种情况进行处理。
3.兄弟节点是黑色
3.1 兄弟节点没有儿子是红色节点,染红兄弟
3.1.1 父亲为红色,染黑父亲
3.1.2 父亲为黑,对父亲节点进行修复双黑
3.2 兄弟有红色儿子,不能直接染红黑色
3.2.1 直线型(兄弟的红色儿子和兄弟在树的同侧)
3.2.2 三角型(兄弟的红色儿子和兄弟在树的不同侧)
实例:
Step1:准备一棵红黑树,然后删除500
Step2:交换500和602节点的值,删除500节点
Step3 :删除300,其替换节点是388,删除后如下图所示
Step4:删除388,其替换节点是400,最终删除400
Step4.1 交换删除节点和替换节点的值
Step4.2 删除388节点
Step4.2.1 删除节点的兄弟节点是红色,先左旋父节点
Step4.2.2 将父亲节点染,染黑兄弟节点,
Step4.2.3 388节点的兄弟节点是黑色,且没有红色孩子,染红兄弟节点,父亲为红色,染黑父亲节点
本文根据观看视频,所做笔记,仅供参考,如果有问题,欢迎留言讨论。