红黑树是更高级的平衡二叉查找树
红黑树的由来
二叉查找树由于可能出现数据在一侧倾斜,性能会大幅降低,因此有平衡二叉树改善;
自平衡二叉树(AVL树)几乎每次插入和删除都需要旋转(有平衡因子),性能会大打折扣;
红黑树是宽松的平衡(没有平衡因子,依靠5条特性来维持),整体性能更好
红黑树和AVL树如何选择
搜索的次数远远大于插入和删除,选择AVL树;
搜索、插入、删除次数几乎差不多,选择红黑树;
相对于AVL树来说,红黑树牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树;
红黑树的平均统计性能优于AVL树,实际应用中更多选择使用红黑树
红黑树的特性
有5个特性,因为5条特性,可以保证红黑树等价于4阶B树,1<=key<=3
#节点是红色或黑色 - 非红即黑
#根是黑色 - 根黑色
#叶子节点(外部节点,空节点)都是黑色,这里的叶子节点指的是最底层的空节点(外部节点),下图中的那些null节点才是叶子节点,null节点的父节点在红黑树里不将其看作叶子节点 - 每个最底层节点隐形的挂着黑色null节点,null节点才叫叶子节点
#红色节点的子节点都是黑色 - 红色的父子是黑色,不存在连续2个红色
##红色节点的父节点都是黑色
##从根节点到叶子节点的所有路径上不能有 2 个连续的红色节点
#从任一节点到叶子节点的所有路径都包含相同数目的黑色节点 - 从任意节点往叶子的任意路径,黑色数量相同
红黑树的操作
旋转:左旋是将某个节点旋转为其右孩子的左孩子,而右旋是节点旋转为其左孩子的右孩子
查找:与其他树一样,找到最后一层
插入:
#在叶子中插入
#用红色
#如果是根,则设为黑色
删除:
#在最底下一层删除
写操作后使用5条特性来决定是否需要旋转、变色,保障平衡
红黑树的代码
代码参考Java的TreeMap,笔记好的红黑树源码,而JDK8开始的HashMap由数组+链表升级为数组+链表+红黑树,链表转红黑树的条件是 链表长度大于等于 TREEIFY_THRESHOLD8,且整个数组容量大于等于 MIN_TREEIFY_CAPACITY64
其他参考资料 https://blog.csdn.net/cy973071263/article/details/122543826