介绍红黑树之前可以先了解一下二叉搜索树和AVL树,毕竟红黑树是为了弥补二叉搜索树的不足而诞生的嘛
动图演示 静态图演示
动态图演示
静态图演示
注意:
插入节点,必须为红色,理由很简单,红色在父节点(如果存在)为黑色节点时,红黑树的黑色平衡没被破坏,不需要做自平衡操作。 但如果插入结点是黑色,那么插入位置所在的子树黑色结点总是多1,必须做自平衡。在开始每个情景的讲解前,我们还是先来约定下:
最简单的一种情景,直接把插入结点作为根结点就行 注意:根据红黑树性质2:根节点是黑色。还需要把插入结点设为黑色
更新当前节点的值,为插入节点的值
由于插入的结点是红色的,并不会影响红黑树的平衡,直接插入即可,无需做自平衡
根据红黑树的性质2:根结点是黑色。如果插入节点的父结点为红结点,那么该父结点不可能为根结点,所以插入结点总是存在祖父结点。后续的旋转操作肯定需要祖父结点的参与
依据红黑树性质4可知,红色节点不能相连 ==> 祖父结点肯定为黑结点; 因为不可以同时存在两个相连的红结点。那么此时该插入子树的红黑层数的情况是:黑红红。显然最简单的处理方式是把其改为:红黑红 处理: 1.将P和U节点改为黑色 2.将PP改为红色 3.将PP设置为当前节点,进行后续处理 可以看到,我们把PP结点设为红色了,如果PP的父结点是黑色,那么无需再做任何处理; 但如果PP的父结点是红色,则违反红黑树性质了。所以需要将PP设置为当前节点,继续做插入操作自平衡处理,直到平衡为止
处理: 1.变颜色:将P设置为黑色,将PP设置为红色 2.对PP节点进行右旋
处理: 1.对P进行左旋 2.将P设置为当前节点,得到LL红色情况 3.按照LL红色情况处理(1.变颜色 2.右旋PP)
处理: 1.变颜色:将P设置为黑色,将PP设置为红色 2.对PP节点进行左旋
处理: 1.对P进行右旋 2.将P设置为当前节点,得到RR红色情况 3.按照RR红色情况处理(1.变颜色 2.左旋PP)
把7插进红黑树 介绍了红黑树的理论,接下来就是手撕代码了 手写红黑树
