因为学习HashMap的时候,遇到了红黑树,故而复习哈,
想深度学习的请转到下面链接,作者图文并茂的详细讲解了哈,分析的很清楚,觉得好的不忘给别人手动比心。
30张图带你彻底理解红黑树
因为从这里开始,是自己的学习笔记,从上面提到的文章中学习总结的,主要是为了给自己看,记录哈,容易忘记,纯概念,可能比较苦涩,见谅
首先说一下,红黑树的规则,
1,根节点必须是黑色的
2,节点只有两种颜色,黑色和红色
3,红色节点的两个子节点一定都是黑色的
4,每一个节点通往叶子节点的路径上的黑色节点的个数相同
5,每个叶子节点都是黑色的
红黑树插入节点,8种场景
情景一,红黑树为空
直接把插入节点作为根节点
情景二,插入节点的key已经存在
直接替换值
情景三,插入节点的父节点是黑色的
直接插入
情景四,插入节点的父节点是红色的
1,叔叔节点存在,且为红色
祖父节点变红色,父亲,叔叔节点转黑色。
2,叔叔节点为空或者为黑色,且父亲节点是祖父节点的左子节点
<1>插入节点是父节点的左子节点
祖父节点变为红色,父节点变为黑色,右旋祖父节点
<2>插入节点是父亲节点的右子节点,
父亲节点左旋,父亲节点转黑色,祖父节点转红色,右旋祖父节点
3,叔叔节点为空或为黑色,且父亲节点是祖父节点的右子节点
<1>插入节点是父亲节点的右子节点
祖父节点变为红色,父亲节点变为黑色,左旋祖父节点
<2>插入节点是父亲节点的左子节点
右旋父亲节点,父亲节点变为红色,祖父节点变为黑色,左旋祖父节点
红黑树删除场景,9中场景,
删除场景,
1,没有子节点,直接删除
2,只有一个子节点,用子节点代替删除节点。
3,有两个子节点,用后继节点代替删除节点(其实用前继节点也一样)。后继节点就是,右子树最左边的叶子节点
删除思想,在不考虑键值的情况下,将删除节点,转换为删除替换节点。替换节点就是后继节点。并且在最后,将删除节点的键值改为替换节点的值,并将替换节点删除,所以此处我们就需要考虑替换节点删除时的,二叉树平衡问题。
情景一,替换节点是红色,
直接删除
情景二,替换节点是黑色
2.1,替换节点是左子节点
2.1.1替换节点的兄弟节点是红色节点
兄弟节点转换为黑色,父亲节点转换为红色,左旋父亲节点。那么转到2.1.2.(3);
2.1.2替换节点的兄弟节点是黑色节点
2.1.2.(1)替换节点的兄弟节点的左子节点颜色任意,右子节点红色
修改兄弟节点的颜色为父节点的颜色,父亲节点修改为黑色,兄弟节点的右子节点修改为黑色,左旋父亲节点
2.1.2.(2)替换节点的兄弟节点的左子节点是红色,右子几点是黑色
兄弟节点的左子节点变为黑色,兄弟节点变为红色,兄弟节点右旋,转到2.1.2.(1)
2.1.2.(3)替换节点的兄弟节点的左子节点是黑色,右子节点是黑色
兄弟节点变为红色,替换节点变为父节点,继续进行删除规则。
当替换节点向上,定位到根节点的时候,结束,并删除节点
2.2,替换节点是右子节点
2.2.1 替换节点的兄弟节点是红色节点的时候,
兄弟节点变为黑色,父亲节点变为红色,父亲节点右旋,转到2.2.2.(3)
2.2.2 替换节点的兄弟节点是黑色节点的时候
2.2.2.(1) 替换节点的兄弟节点的左子节点是红色,右子节点任意
左子节点变为父亲节点的颜色,父亲节点变为红色,兄弟节点的左子节点变为黑色,右旋父亲节点。
2.2.2.(2)替换节点兄弟节点的左子节点是黑色,右子节点是红色,
兄弟节点变为红色,右子节点变为黑色,左旋兄弟节点,转到2.2.2.(1)
2.2.2.(3)替换节点的兄弟节点的左子节点是黑色,右子节点也是黑色,
兄弟节点转为红色节点,删除节点变为父节点,继续进行删除规则。