红黑树添加删除

上一篇写了234树对比红黑树,和红黑树某些状况须要调整的缘由,这篇就只写红黑树的添加和删除html

红黑树

性质

  1. 每一个节点要么红色要么黑色
  2. 根节点是黑色
  3. 每一个叶节点是黑色的,这里叶子节点指空的节点,和二叉树的叶子节点不一样
  4. 每一个红色节点的两个子节点都是黑色
  5. 每一个节点到它的每一个叶子节点的全部路径都包含相同数目的黑色节点

添加

全部添加的节点默认都是红色3d

  1. 空节点
  2. 父节点为黑色
  3. 父节点为红色

1 空节点

全部节点默认为红色,添加后5为根节点,违反了性质2"根节点是黑色" ,只须要将红变黑便可htm

2 父节点为黑色

2.1 父节点为黑色,直接添加,小于父添加左边,大于等于添加右边

3 父节点为红色

状况1 祖孙三代在一条线

直接进行旋转变色便可blog

而这里面还有一种状况递归

咱们须要先将5和6进行旋转,让它变成上面的状况,而后按照上面的操做进行添加get

状况2有叔叔节点

状况2.1叔叔节点为红色

首先将父节点和叔叔节点变黑,爷爷节点变红,若是10节点为根节点,那么再变黑,若是10节点变红与上面发生冲突,那么把10节点做为新添加的节点,再继续执行调整博客

删除

状况二叉树

  1. 没有子节点
  2. 有一个子节点
  3. 有两个子节点

先说有两个子节点的状况,须要寻找到它的前驱或后继节点来替代,而后删除前驱或后继节点,也就是将状况转换为1或2方法

关于前驱或后继节点看上篇文章im

没有子节点

1.1 节点为红色

没有子节点且当前节点为红色直接删除

1.2 节点为黑色

1.2.1兄弟节点为红色

1.2.2兄弟节点为黑色且有一个子节点

1.2.3兄弟节点为黑色且有两个子节点

1.2.4兄弟节点为黑色,没有子节点

1.2.1兄弟节点为红色

须要将兄弟节点进行旋转变色,为何兄弟节点为红色须要旋转变色缘由能够看上一篇博客,将状况变为234

1.2.2兄弟节点为黑色且有一个子节点

在这里面还有一种 小状况,兄弟节点的子节点若是离本身近须要先进行旋转变色,将状况变成上面的再进行操做

1.2.3兄弟节点为黑色且有两个子节点

有两种解决方法

1 先删除5同时将15和20进行右旋变色,而后10和15进行左旋变色,而20和15就是上面的状况,旋转完后15两个子节点必须是黑色,若是15节点于红黑树性质冲突,那么在根据状况调整

2 直接删除5,而后10和20进行左旋,通常都用这个方法,减小一次旋转

1.2.4兄弟节点为黑色,没有子节点

父节点为红色

删除5,而后兄弟节点变为红色来维持父节点的左右黑色平衡,若是父节点为红色,直接变黑便可,父节点变黑是维护爷爷节点的左右黑色平衡

若是父节点为黑色

一样也是将兄弟节点变红,而后把父节点向上递归处理

删除一个黑色节点,而后改一个红色节点,这个父节点的黑色是平衡了,若是上面还有节点呢,那么黑色节点仍是不平衡,

这时就须要递归进行操做,直到出现红色父节点将其变为黑色或到达根节点为止

有子节点

  1. 删除节点为红色
  2. 删除节点为黑色

1 删除节点为红色

直接删除

2 删除节点为黑色

只会有一种状况,有一个红色的左孩子或右孩子,若是有两个孩子那么就会去删除前驱或后置而不是当前节点,

也不可能出现一个孩子为黑色一个孩子为红色,更不可能出现只有一个黑色孩子,根据红黑树性质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)节点 若是还有父亲则继续递归操做,如今发现到根节点,调整完成

本文仅我的理解,若是有不对的地方欢迎评论指出或私信,谢谢٩(๑>◡<๑)۶

相关文章
相关标签/搜索