了解二叉查找树
二叉树特点
- 左子树上所有的节点值均小于或等于他的根节点的值
- 右子树上所有的节点的值均大于或等于他的根节点的值
- 左右子树也一定分别为二叉排序树
二叉查找树缺点
插入新节点会导致不平衡,可能会导致一边特别长,查询的性能大大折扣,几乎就是线性查找
红黑树
红黑树特点
符合二叉查找树的特征之外还符合一下性质
- 节点颜色为红色或者黑色
- 根节点为黑色
- 每个叶子的节点都是黑色的空节点(NULL或NIL节点), 称为叶子节点
- 每个红色节点的两个子节点都是黑色, 不存在两个连续的红色节点
- 从任意节点到其每个叶子的所有路径都包含相同的黑色节点
上图中P根节点的左子树比右子树高,但左子树和右子树的黑色节点才层数是相等的,也就是任意一个节点到叶子节点的路径都包含了相同数量的黑色节点(性质5),这种平衡称为黑色完美平衡.
红黑树自平衡操作
左旋
以某个节点作为旋转节点,其右子节点变为旋转节点的父节点,右子节点的左子节点变为旋转节点的右子节点,左子节点保持不变.左旋只影响旋转结点和其右子树的结构,把右子树的结点往左子树挪了。
右旋
以某个节点作为旋转节点,其左子节点变为旋转节点的父节点,左子节点的右子节点变为旋转节点的左子节点,右子节点保持不变.右旋只影响旋转结点和其左子树的结构,把左子树的结点往右子树挪了。
变色
根据特性将节点颜色红黑变化
红黑树查找流程
- 从根节点开始查找,把根节点设置为当前节点
- 若当前节点为空,返回null
- 若当前节点不为空,用当前节点的key和查询的key比较
- 若当前节点key等于查找的key,那么久返回当前节点
- 若当前节点key大于查找的key,就把当前节点的左子节点设为当前节点,然后再进行比较
- 若当前节点key小于查找的key,就把当前节点的右子节点设为当前节点,然后再进行比较
红黑树插入流程
红黑树删除
- 情景1:若删除结点无子结点,直接删除
- 情景2:若删除结点只有一个子结点,用子结点替换删除结点
- 情景3:若删除结点有两个子结点,用后继结点(大于删除结点的最小结点)替换删除结点