1 定义
红黑树(Red Black Tree,RB Tree)是一种自平衡的二叉查找树。
在红黑树的每个节点上都多出一个存储位表示节点的颜色,红色(Red)或者黑色(Black)。
红黑树的特性:
- 每个节点,或者是黑色,或者是红色;
- 根节点是黑色;
- 每个叶子节点都是黑色的空节点(NIL节点);
- 从任一结点到其每个叶子节点的所有路径,黑色结点数目相同;
- 从根节点到每个叶子的所有路径,不能存在连续的红色结点。
2 左旋
对a节点进行左旋,指将a节点的右子节点设为a节点的父节点,即将a节点变成一个左节点。因此左旋意味着被旋转的节点将变成一个左节点,具体流程如图所示。
3 右旋
对b节点进行右旋,指将b节点的左子节点设为b节点的父节点,即将b节点设为一个右节点。因此右旋意味着被旋转的节点将变成一个右节点,具体流程如图所示。
4 添加
局面1:新结点(A)位于树根。
自平衡:变色。
局面2:新结点(B)的父结点是黑色。
自平衡:无需调整。
局面3:新结点(D)的父结点和叔叔结点都是红色。
自平衡:变色。
局面4:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,父结点(B)是祖父结点的左孩子,且新结点是父结点的右孩子。
自平衡:左旋->局面5。
局面5:新结点(D)的父结点是红色,叔叔结点是黑色或者没有叔叔,父结点(B)是祖父结点的左孩子,且新结点是父结点的左孩子。
自平衡:右旋->变色。
5 删除
第一步:替换待删除的节点为替换节点,此时替换节点成为新的待删除节点。
第二步:根据待删除结点和其唯一子结点的颜色,分情况处理。
情况1,自身是红色,子结点是黑色。
自平衡:无需调整。
情况2,自身是黑色,子结点是红色。
自平衡:变色。
情况3,自身是黑色,子结点也是黑色,或者子结点是空叶子结点,分6种子情况:
子情况1,结点2是红黑树的根结点。
自平衡:无需调整。
子情况2,结点2的父亲、兄弟、侄子结点都是黑色。
自平衡:变色->递归地判断并调整。
子情况3,结点2的兄弟结点是红色。
自平衡:左旋->变色->子情况4、5、6。
子情况4,结点2的父结点是红色,兄弟和侄子结点是黑色。
自平衡:变色。
子情况5,结点2的父结点随意,兄弟结点B是黑色右孩子,左侄子结点是红色,右侄子结点是黑色。
自平衡:右旋->变色->情况6。
子情况6,结点2的父结点随意,兄弟结点B是黑色右孩子,右侄子结点是红色。
自平衡:左旋->变色。
6 红黑树与AVL树的比较
红黑树 | AVL树 | |
---|---|---|
子树高度差 | 不超过2倍 | 不超过1 |
效率 | 查询较慢,增删较快 | 查询较快,增删较慢 |