系列文章目录
文章目录
1、红黑树的定义
1、节点是红色或黑色
2、根节点是黑色
3、不能有两个连续的红色节点(但是可以有两个连续的黑色节点)
4、从任一节点到其每个叶子节点路径经过的黑色节点个数相同。
性质3和4共同决定了:**最长路径的节点总数量不会超过最短路径的两倍。**因为黑色节点数量要一样,红色不能连着来,从而路径全黑时最短,红黑交替时最长。比如4个黑色节点,最短:黑-黑-黑-黑(4),最长:黑-红-黑-红-黑-红-黑(7)。
2、插入
首先约定一下节点的名称:
红黑树属于二叉搜索树,插入动作也与二叉搜索树一致,只不过红黑树在插入之后,多了平衡动作(旋转与涂色)。
新插入的节点均为红色节点,因为红色不会影响路径上黑色节点的数量,保持性质4。如果父节点为黑色,就直接结束了;如果父节点为红色,则需要另外处理了。
以新插入的节点为当前平衡节点N,插入平衡大体上分为以下情形:
情形一:N为根节点
直接插入,颜色变为黑色。
情形二:父节点为黑色
直接插入,无需其他操作
情形三: 父节点和叔叔节点均为红色
将父亲和叔叔节点变为黑色,祖父节点变为红色,以祖父节点为要插入的节点继续向根节点方向遍历,执行平衡操作。
情形四: 父节点为红色,叔叔节点为黑色,且父亲和N同一边
父亲和N节点都为其父亲的左子树,父节点变为黑色,祖父节点变为红色,以祖父节点进行右旋操作。
父亲和N节点都为其父亲的右子树,父节点变为黑色,祖父节点变为红色,以祖父节点进行左旋操作。
情形五: 父节点为红色,叔叔节点为黑色,且父亲和N不在同一边
父亲在左边,N在右边,以父节点进行左旋,这时父亲和N都在左边,在进行上述同左操作即可。
父亲在右边,N在左边,以父节点进行右旋,这是父亲和N都在右边,在进行上述同右操作即可。
3、总结
- 插入节点为根节点,变为黑色
- 父节点为黑色,直接插入
- 父节点和叔叔节点均为红色,父节点和叔叔节点均变为黑色,祖父节点变红,把祖父节点当作要插入节点,递归执行。
- 父节点和插入节点在同一边,父节点变黑,祖父节点变红,同左右旋,同右左旋。
- 父节点为红色,叔叔节点为黑色,如果不在同一边,转换为同一边(N在右边以父节点左旋;N在左边,以父节点右旋),然后执行步骤四。
4、完整例子
例:插入 10,20,15,30,5,8;
参考连接:
https://www.jianshu.com/p/96e652ccf720