https://www.bilibili.com/video/BV18e411s7ri?from=search&seid=7659043137742768963
hash_map 数组+链表+红黑树 大于等于8时链表转为红黑树,反之同理。
红黑树
自平衡二叉查找树,在O(logn)时间内做查找,插入和删除。
c++的map和set都是用红黑树实现的。
红黑树的性质:
- 每个结点不是红色就是黑色
- 不可能有连在一起的红色结点
- 根节点都是黑色
- 红色结点的两个子结点都是黑色
为了满足红黑树性质,有三条规则
变色,左旋,右旋
左旋:以某个结点作为支点(旋转结点),其右子结点变为旋转结点的父结点,右子结点的左子结点变为旋转结点的右子结点,其左子结点保持不变。
右旋:以某个结点作为支点(旋转结点),其左子结点变为旋转结点的父结点,左子结点的右子结点变为旋转结点的左子结点,其右子结点保持不变。
变色:结点的颜色由红变黑或由黑变红。
旋转和颜色变换规则:
变颜色:当前结点父亲是红色,且它的祖父结点的另一个子结点也是红色(叔叔结点):
- 把父结点设为黑色
- 叔叔设为黑色
- 祖父设为红色
- 指针定义到祖父结点设为当前操作对象
左旋:当前父结点是红色,叔叔是黑色,且当前结点是右子树,左旋,父结点为支点。
右旋: 左
- 父结点变为黑色
- 祖父结点变为红色
- 以祖父结点为支点旋转