什么是红黑树?
性质
- 每个节点不是红色就是黑色
- 不可能有连在一起的红色节点
- 根节点都是黑色 root
- 每个红色节点的两个子节点都是黑色。叶子节点都是黑色:出度为0
满足了性质就可以近似的平衡,不一定要红黑,可以为其他的
为了满足红黑树的性质,因此出现了旋转:
三种变换:
- 改变颜色:最简单 红变黑 黑变红
- 左旋:针对于点旋
- 右旋
旋转和颜色变换规则:所有插入的点默认为红色
变颜色的情况:
当前节点的父亲是红色,且它的祖父节点的另一个子节点也是红色(叔叔节点):
- 把父节点设为黑色
- 把叔叔也设为黑色
- 把祖父也就是父亲的父亲设为红色(爷爷节点)
- 把指针定义到祖父节点设为当前要操作的
左旋
当前父节点是红色,叔叔是黑色的时候,且当前的节点是右子树,左旋以父节点作为左旋。
右旋
当前父节点是红色,叔叔是黑色的时候,且当前的节点是左子树,右旋
- 把祖父节点变为黑色
- 把祖父节点变为红色(爷爷)
- 以祖父节点旋转(爷爷)
红黑树的应用:
- HashMap : JDK8:数据+链表+红黑树(8)
- TreeMap:set底层
- Windows:MySQL btree
- 各种底层系统数据结构:JDK,Linux进程调度
- Nginx等等