码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • HashMap中红黑树插入节点的调整过程


    目录
    • 一、引言
    • 二、HashMap源码中红黑树插入节点的调整过程
    • 三、阅读HashMap源码的一些Tips
      • 1. 代码风格
      • 2. 变量名
        • balanceInsertion方法中的变量名
        • rotateLeft、rotateRight方法中的变量名

    一、引言

    如果有对红黑树的定义及调整过程有过研究,其实很容易理解HashMap中的红黑树插入节点的调整过程。

    “红黑树定义及调整过程”的参考文章:《红黑树原理、查找效率、插入及变化规则分析》

    下面的流程图就是HashMap源码中,红黑树插入节点的调整过程。这个过程要是写文章讲的话,感觉也没什么意思,其实关键还是需要你要清楚红黑树的定义及调整过程,然后知道数据结构里二叉树左旋、右旋调整的过程。接下来需要做的,就是慢慢啃这段不长的源码。

    你看到最后会发现,这个过程中的判断、步骤,都是基于我上面说的:红黑树的定义、红黑树的调整过程、二叉树左旋/右旋调整的过程,然后就是一些指针操作。

    二、HashMap源码中红黑树插入节点的调整过程

    三、阅读HashMap源码的一些Tips

    1. 代码风格

    HashMap源码中特别喜欢在判断语句中加赋值语句,形如:if ((xp = x.parent) == null)。它这一行代码做了两件事:

    1. 把x.parent赋值给xp
    2. 判断xp是否为null

    还喜欢使用连等号,形如:pp = r.parent = p.parent。它这一行代码也做了两件事:

    1. 把p.parent赋值给r.parent
    2. 把r.parent赋值给pp

    这种代码风格我看着很不习惯,但是看多了后,也就习惯了。

    2. 变量名

    源码中的树指针的变量命名其实很有规律:r对应右子树,l对应左子树,p对应父节点,pp对应爷爷节点。
    举个例子:变量名pr的含义是,父节点的右子树。

    balanceInsertion方法中的变量名

    root x所在树的根节点
    x 要插入的节点
    xp x的parent节点
    xpp x的parent的parent -> 爷爷节点
    xppl x的爷爷节点的左子树
    xppr x的爷爷节点的右子树
    +-----+
    +----+ +----+
    | +-----+ |
    | xpp |
    +--v--+ +--v--+
    +------+ | | |
    | +-----+ +-----+
    | xppl xppr
    +--v--+ xp
    | |
    +-----+
    x

    rotateLeft、rotateRight方法中的变量名

    p 旋转的关键点
    pp p的parent节点
    r p的右子节点节点
    l p的左子节点节点
    rl p的右子节点节点的左子节点
    lr p的左子节点节点的右子节点
  • 相关阅读:
    Sentinel规则
    【前端攻城师之JS基础】03函数进阶
    【Linux笔记】Linux基础权限
    灵性图书馆:好书推荐-《断轮回》
    AP5101C 高压线性恒流IC 宽电压6-100V LED汽车大灯照明 台灯LED矿灯 指示灯电源驱动
    高考志愿选专业,如何分析自己的兴趣爱好?
    数据结构—内部排序(上)
    前端新轮子Nue,号称替代Vue、React和Svelte
    C语言学习笔记 库文件
    申请软著需要注意哪些方面
  • 原文地址:https://www.cnblogs.com/daheww/p/16216250.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号