码农知识堂 - 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的左子节点节点的右子节点
  • 相关阅读:
    蓝桥等考Python组别十三级008
    MATLAB程序设计与应用 2.5 MATLAB运算
    Linux-本地日志服务管理(rsyslog基础)
    子网划分
    自动化物流运输设备模组要选择哪种类型?
    【Linux】进程控制 (万字详解)—— 进程创建 | 进程退出 | 进程等待 | 程序替换 | 实现简易shell
    go 定时清理函数 --chatGPT
    static关键字
    JAVA题库——关于java中的方法
    要求设计一款温度采样电路,该电路能够根据被测温度的不同,通过红黄绿三种颜色的指示灯来进行显示。
  • 原文地址:https://www.cnblogs.com/daheww/p/16216250.html
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号