红黑树 简介

红黑树是更高级的平衡二叉查找树


红黑树的由来


二叉查找树由于可能出现数据在一侧倾斜,性能会大幅降低,因此有平衡二叉树改善;
自平衡二叉树(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 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值