上一篇写了234树对比红黑树,和红黑树某些状况须要调整的缘由,这篇就只写红黑树的添加和删除html
全部添加的节点默认都是红色3d
全部节点默认为红色,添加后5为根节点,违反了性质2"根节点是黑色" ,只须要将红变黑便可htm
直接进行旋转变色便可blog
而这里面还有一种状况递归
咱们须要先将5和6进行旋转,让它变成上面的状况,而后按照上面的操做进行添加get
首先将父节点和叔叔节点变黑,爷爷节点变红,若是10节点为根节点,那么再变黑,若是10节点变红与上面发生冲突,那么把10节点做为新添加的节点,再继续执行调整博客
状况二叉树
先说有两个子节点的状况,须要寻找到它的前驱或后继节点来替代,而后删除前驱或后继节点,也就是将状况转换为1或2方法
关于前驱或后继节点看上篇文章im
没有子节点且当前节点为红色直接删除
1.2.1兄弟节点为红色
1.2.2兄弟节点为黑色且有一个子节点
1.2.3兄弟节点为黑色且有两个子节点
1.2.4兄弟节点为黑色,没有子节点
须要将兄弟节点进行旋转变色,为何兄弟节点为红色须要旋转变色缘由能够看上一篇博客,将状况变为234
在这里面还有一种 小状况,兄弟节点的子节点若是离本身近须要先进行旋转变色,将状况变成上面的再进行操做
有两种解决方法
1 先删除5同时将15和20进行右旋变色,而后10和15进行左旋变色,而20和15就是上面的状况,旋转完后15两个子节点必须是黑色,若是15节点于红黑树性质冲突,那么在根据状况调整
2 直接删除5,而后10和20进行左旋,通常都用这个方法,减小一次旋转
父节点为红色
删除5,而后兄弟节点变为红色来维持父节点的左右黑色平衡,若是父节点为红色,直接变黑便可,父节点变黑是维护爷爷节点的左右黑色平衡
若是父节点为黑色
一样也是将兄弟节点变红,而后把父节点向上递归处理
删除一个黑色节点,而后改一个红色节点,这个父节点的黑色是平衡了,若是上面还有节点呢,那么黑色节点仍是不平衡,
这时就须要递归进行操做,直到出现红色父节点将其变为黑色或到达根节点为止
直接删除
只会有一种状况,有一个红色的左孩子或右孩子,若是有两个孩子那么就会去删除前驱或后置而不是当前节点,
也不可能出现一个孩子为黑色一个孩子为红色,更不可能出现只有一个黑色孩子,根据红黑树性质5就明白了
那么来看只有一个红色子节点状况
先将10和它的红色子节点20进行旋转变色,而后直接删除,5节点能够是红也能够是黑
属于有父节点和叔叔节点,且都为红色,根据添加的3.2.1父节点和叔叔节点都为红色进行变色处理
完成后发现由于变色6节点和4节点出现了连续两个红色,须要继续调整,把6当作新添加的节点,发现属于状况3.1祖孙三代在一条线,将2和4节点进行旋转变色
咱们删除4节点,这里4就是根节点
首先判断是那种状况,有两个子节点那就是寻找前驱或后继进行替换,咱们这里使用前驱节点,也就是3
首先判断3节点的状况,没有子节点,兄弟节点也没有节点,那就是删除状况的1.2.4兄弟节点为黑色,没有子节点
首先将值覆盖掉,而后删除3节点,将3节点的兄弟节点变色为红色
而后发现父节点为黑色,不能进行变色来平衡,那么把2节点当作须要删除的节点(并不真正删除)继续调整
发现兄弟节点为黑色且有两个子节点,属于删除状况的1.2.3,只须要进行旋转便可
删除节点6
有两个节点,寻找前驱或后继,此次咱们使用后继节点,也就是8,仍是首先把值赋给6,而后进行删除
将8删除,兄弟节点变色,发现父节点为黑色,不能进行变色保持黑色平衡,那么只能向上递归
将9的兄弟节点变色为红色,若是这个6 (8)节点 若是还有父亲则继续递归操做,如今发现到根节点,调整完成
本文仅我的理解,若是有不对的地方欢迎评论指出或私信,谢谢٩(๑>◡<๑)۶