Chap27 Balanced BSTs
1 AVL Insertion
- 对于每个node,其子节点的高度最多差1,为balance
- 先正常插入并记录每个node的高度,如果违法,则通过一次旋转,保持树的高度为lg(N)
rotating left
- single rotations
- double rotation --> 如果不平衡是由右子树的左子树(或左子树的右子树)的生长引起
2 AVL Delete
3 Red-Black Insert
- 从根到叶的路径的最大长度是O(lg(N)),但不平衡
- 红黑树
- 每个结点的颜色不是红色就是黑色
- 根是黑色的
- 如果一个节点是红色的,它的子节点必须是黑色的
- 从root到NULL的每条路径必须有相同数量的黑节点
- 最长路径最多是最短路径的两倍
- 通常认为NULL节点是黑色的(而不是作为一个独立的“非节点”实体)
- 当添加到红黑树时,所添加的节点必须是红色的;新节点的父节点必须是黑色
- 当沿树向下遍历时,检查当前节点是否是一个带有两个红色子节点的黑节点(任何带有红色子节点的节点都必须是黑的)。如果两个子节点都为红色,则将当前节点重新设置为红色,将子节点重新设置为黑色
- 如果当前节点的父节点是红色的,那么会在一行中引入了两个红色节点,此时通过旋转和重新着色节点来修复它
- 如果根被染成红色,直接换为黑色
- 注意10的左子结点是黑色,且永远只可能是黑色
4 Red-Black Delete
- 如果树中删除的节点是红色的,直接删除
- 删黑色点,需要重新着色和旋转
- Matt Might方法引入double black(+2个黑节点) 和 negative black(-1个黑节点),首先在删除站点“双黑”(回想一下:NULL节点通常被视为黑色)临时着色NULL节点,这将维护黑色计数,尽管必须删除“双黑”节点才能调用进程完成
http://matt.might.net/articles/red-black-delete/