地址
演示地址:
红黑树动画在线演示
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兄弟节点的左子节点红色&右子节点(任意色|不存在)
删除节点的兄弟节点与父节点(注意父节点为根节点时只能为黑色)交换颜色、将兄弟节点的左子节点设置为黑色、对父节点右旋。