红黑树
本质是二叉查找树,在其基础上多了五个性质
- 节点是红色或者黑色
- 根节点是黑色
- 叶子节点是黑色(null节点)
- 每个红色节点的两个子节点一定都是黑色
- 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点(黑色完美平衡)
红黑树并不是完美平衡二叉树,这些规则使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。
1. 查找
和二叉树查找方法一致
2. 插入
核心思想:变色,左旋,右旋(调整自己,父节点,爷爷节点,叔叔节点的位置)
先找到插入位置,以红色插入(此时没有违背性质5,只需满足性质4即可)。因此,只需关心父节点是否为红。
情况1. 父节点和叔叔节点都是红色
假设插入的是节点 N,这时父亲节点 P 和叔叔节点 U 都是红色,爷爷节点 G 一定是黑色。
红色节点的孩子不能是红色,这时不管 N 是 P 的左孩子还是右孩子,只要同时把 P 和 U 染成黑色,G 染成红色即可。这样这个子树左右两边黑色个数一致,也满足特征 4。
但是这样改变后 G 染成红色,G 的父亲如果是红色岂不是又违反特征 4 了?
这个问题和我们插入、染红后一致,因此需要以 爷爷节点 G 为新的调整节点,再次进行调整操作,以此循环,直到父亲节点不是红的,就没有问题了。
情况2. 父节点为红,叔叔节点为黑(或不存在)
此时爷爷节点 G 一定是黑色。需要分两种情况(左节点还是右节点)通过左旋或者右旋+变色。
3. 删除