红黑树简介
红黑树是一种特殊的二叉搜索树
红黑树的性质:
- 节点是红色或黑色。
- 根节点是黑色。
- 每个叶子节点都是黑色的空节点(NIL节点)。
- 从每个叶子到根的所有路径上不能有两个连续的红色节点。
- 从任一节点到其每个叶子的所有路径都包含相同数目的黑色节点。
与平衡二叉树的区别
1、红黑树放弃了追求完全平衡,追求大致平衡,在与平衡二叉树的时间复杂度相差不大的情况下,保证每次插入最多只需要三次旋转就能达到平衡,实现起来也更为简单。
2、平衡二叉树追求绝对平衡,条件比较苛刻,实现起来比较麻烦,每次插入新节点之后需要旋转的次数不能预知。
节点的插入
节点插入旋转步骤
首先以二叉搜索树的方式进行插入,指针指向插入节点,且设置为红色。
- 变颜色:当前节点的父亲是红色,且他的祖父节点的另一个子节点也是红色(叔叔节点):
- 把父节点设为黑色。
- 把叔叔节点也设置成黑色。
- 把爷爷节点设为红色。
- 把指针指向爷爷节点,重新进行上述操作。
- 左旋:当父节点是红色,叔叔是黑色的时候,且当前节点是右子树,指针指向其父节点,然后以其父节点左旋。
- 右旋:当父节点是红色,叔叔是黑色的时候,且当前节点是左子树,指针指向其父节点,然后:
- 将父节点变成黑色
- 将祖父节点变成红色
- 以祖父节点右旋
插入例子
- 将节点6置为红色,插入二叉搜索树。
- 判断6的父节点7与叔叔节点13都是红色,那么执行情况1:父节点和叔叔节点变成黑色,爷爷节点变成红色,然后将指针指向爷爷节点。
- 此时指针在12,其父节点5是红色,叔叔节点30是黑色,且是父节点的右子树,执行情况2,指针指向5,以5点为中心左旋。
- 此时5的父节点是红色,叔叔节点是黑色且是父节点的左子树,指针指向父节点12,父节点变成黑色,爷爷节点变成红色,以爷爷节点为中心右旋。
这就是最后的红黑树。
节点的删除
将红黑树内的某一个节点删除。需要执行的操作依次是:首先,将红黑树当作一颗二叉查找树,将该节点从二叉查找树中删除;然后,通过"旋转和重新着色"等一系列来修正该树,使之重新成为一棵红黑树。