红黑树相关知识粗略整理
定义
二叉搜索树
- 左子树上所有节点的值小于根节点的值
- 柚子树上所有节点的值小于根节点的值
- 左右子树也是二叉搜索树
红黑树
- 所有节点都是红色或者黑色(叶子节点默认为黑色)
- 根节点为黑色
- 每个红节点的子节点都是黑色,不能有相邻的红节点
- 从任意节点到他子树的每个叶子结点黑色节点数目相同
操作
红黑树有两大操作来实现插入和删除后的平衡
recolor(重新标记黑色或者红色)、rotation(旋转,树达到平衡的关键)
先尝试recolor是否能达到红黑树的4点要求,如果不行,就尝试rotation
假设插入的节点为X
- 新插入的节点标记为红色
- 如果X为root,则标记为黑色
- 如果X的parent不是黑色,同时X也不是root
- 如果X的uncle是红色
- 将parent和uncle标记为黑色
- grandparent标记为红色
- 让X节点的颜色与X祖父颜色相同,然后X祖父变为新的X,重复2~7步骤
如果uncle不是红色
- Xparent不是黑色,X也不是root:
- 如果uncle是黑色,分4中情况
- 左左(X的父节点为祖父节点的左孩子,X为父节点的左孩子)
- 左右(X的父节点为祖父节点的左孩子,X为父节点的右孩子)
- 右右(X的父节点为祖父节点的右孩子,X为父节点的右孩子)
- 右左(X的父节点为祖父节点的右孩子,X为父节点的左孩子)
左左就一次右旋,左右就先左旋再右旋,右左就先右旋再左旋,右右就一次左旋
旋转之后从2步骤开始