红黑树-学习

地址

演示地址:
红黑树动画在线演示

https://rbtree.phpisfuture.com/

红黑树笔记

https://www.phpisfuture.com/article/1

从学习中总结的笔记

红黑树性质

红黑树是一颗二叉平衡树,查找不会破坏平衡性,所以和二叉平衡术查找方式一致。

从根节点开始查找,为空就返回null,为当前值就返回,否则继续向下查找。
如果当前节点的key为要查找的节点的key,那么直接返回当前值。
如果当前节点的key大于要查找的节点的key,那么继续向当前节点的左子节点查找。
如果当前节点的key小于要查找的节点的key,那么继续向当前节点的右子节点查找。

红黑树查找

红黑树是一颗二叉平衡树,查找不会破坏平衡性,所以和二叉平衡术查找方式一致。

从根节点开始查找,为空就返回null,为当前值就返回,否则继续向下查找。
如果当前节点的key为要查找的节点的key,那么直接返回当前值。
如果当前节点的key大于要查找的节点的key,那么继续向当前节点的左子节点查找。
如果当前节点的key小于要查找的节点的key,那么继续向当前节点的右子节点查找。

插入自平衡

插入的自平衡
插入主要指针指向插入结点,通过4. 红黑树的自平衡将红黑树达到的平衡即可

左旋
条件:当前节点的父节点是红色 & 当前节点的叔叔节点是黑色或者不存在 & 当前结点是其父节点的右子结点。

步骤:

将父节点左旋
将指针指向父结点
右旋
条件:当前节点的父节点是红色 & 当前节点的叔叔节点是黑色或者不存在 & 当前结点是其父节点的左子结点。

步骤:

将父节点变为黑色
将祖父结点变为红色
将祖父结点右旋
将指针指向祖父结点
变色
条件:当前节点的父节点是红色并且当前节点的叔叔节点也是红色。

步骤:

当前结点是根结点直接变为黑色
当前结点不是根结点
将父节点与叔叔节点变为黑色
将祖父结点变为红色
将指针指向祖父结点

查找

红黑树删除

查找删除位置

从根节点开始,如果根节点为空,则删除在根节点,否则根节点为当前节点。
如果当前节点为null,则返回当前节点的父节点进行插入。
如果当前节点的key等与删除节点的key,则找到当前节点。
如果当前节点的key大于删除节点的key,则继续向当前节点的左子节点继续查找。
如果当前节点的key小于删除节点的key,则继续向当前节点的右子节点继续查找。

删除节点

1.删除节点没有子节点。直接执行自平衡即可
2  删除节点有子节点
	2.1 找到替换节点(注意替换结点为根节点的情况)
		2.1.1有两个子节点。
			找到左子树的最大那个节点或者右边最小节点。
		2.1.2有一个节点。
			这个子节点就是替换节点。
	2.2如果删除节点是黑色,替换后进行自平衡即可。

删除后的自平衡

1、删除节点的兄弟节点红色
	1.1删除节点是左子节点。
		删除节点的父节点变红、兄弟节点变黑、父节点左旋、转换成下面任意情况。
	1.2删除节点是右子节点。删除节 点的父节点变红、兄弟节点变黑、父节点右旋、转换成下面任意情况。
2、删除节点的兄弟节点黑色& (兄弟节点有两个 黑色节点|不存在黑色节 点)
	将兄弟节点设置为红色,将指针指向删除节点的父节点。
3、删除节点的兄弟节点是黑色
	3.1兄弟节点右侧
		3.1.1兄弟节点左子节点红色& (右子 节点黑色|不存在黑色节点)
			删除节点的兄弟节点与兄弟节点的左子节点交换颜色(兄弟节点设置为红色,兄弟节点左子节点设置为黑色)、对兄弟节点右旋。之后转化为3.1.2。
		3.1.2兄弟节点左子节点(任意色|不存在) & 右子节点红色。
			删除节点的兄弟节点与父节点(注意父节点为根节点时只能为黑色)交换颜色、将兄弟节点的右子节点设置为黑色、对父节点左旋。
3.2兄弟节点左侧
	3.2.1兄弟节点的左子节点(为黑色|不存在左子节点) & 右子节点为红色。
		删除节点的兄弟节点与兄弟节点的右子节点交换颜色(兄弟节点设置为红色,兄弟节点右子节点设置为黑色)、对兄弟节点左旋。之后转化为3.2.2。
	3.2.2兄弟节点的左子节点红色&右子节点(任意色|不存在)
		删除节点的兄弟节点与父节点(注意父节点为根节点时只能为黑色)交换颜色、将兄弟节点的左子节点设置为黑色、对父节点右旋。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值