按照第一遍的思路,我们对这两种情况执行同样的操作,最终也能保证红黑树的5条特征。
到了这一步,插入操作的所有情况就讲解完毕。另外关于左旋和右旋的知识我在这里不再说明了,因为你看到了红黑树这个程度,相信也一定看过平衡二叉树。左旋右旋哪几种情况,都会有介绍到。
3、删除节点
红黑树的删除说实话更加的复杂,如果你看过算法导论的话应该能明白一点,我们在这里也进行一个大概的讲解。
删除大致分了三种情况,
(1)第一种情况:要删除的节点有零个子节点
这种情况下最简单,也就是删除的是根节点或者是叶子节点(这里的叶子节点都是指非NULL的叶子节点),根节点直接删除即可。如果叶子节点是红色的,也可以直接删除,如果叶子节点是黑色的,那么就需要进行调整,调整的步骤和插入时调整的步骤一样。
(2)第二种情况:要删除的节点有一个子节点
这时候。把子节点的值替换掉要删除的节点的值。
现在我们的5把11替换掉之后,又回到了第一种情况。如果节点5是红色的,可以直接删除,如果节点5是黑色的,那么就需要进行调整,此时的节点5就是叶子节点。调整的步骤和插入时调整的步骤一样。
(3)第三种情况:要删除的节点有两个子节点
现在删除的节点有两个子节点,同样的我们可以执行第二种情况的操作,
若节点13之前是叶子节点,那就和第一种情况一样了,如果节点13是红色的,可以直接删除,如果节点13是黑色的,那么就需要进行调整,此时的节点13就是叶子节点。调整的步骤和插入时调整的步骤一样。
若节点13之前还有子节点,那就和第二种情况一样了。那就继续替换和判断。
以上呢就是删除的情况,最后一种情况是修改,这种情况是查找和插入的结合体,也就是先找到要修改的元素,修改完值之后,继续进行调整即可。
现在还有最后一个问题了,都说红黑树很重要,为什么重要呢?我们来看一下使用场景。
四、使用场景
红黑树的应用真的是太多了,比如说java中的HashMap和TreeMap。还有就是linux也经常使用到。这种数据结构在面试的时候是一个常问问题,希望大家能够明白和理解。如何用java手撕红黑树,在后续文章中我会添加。如有问题还请批评指正。
,