HashMap源码详解01-红黑树插入

本文详细解析了HashMap中红黑树的插入操作。在插入节点时,新节点标记为红色,可能导致红黑树性质破坏,需要通过变色和旋转进行平衡。介绍了插入后平衡的几种情况,包括节点为根节点、父节点为黑色、父节点和叔叔节点均为红色,以及根据节点位置进行的不同旋转操作。
摘要由CSDN通过智能技术生成


红黑树(英语:Red–black tree)是一种 自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型用途是实现关联数组。它在1972年由鲁道夫·贝尔发明,被称为"对称二叉B树",它现代的名字源于Leo J. Guibas和Robert Sedgewick于1978年写的一篇论文。红黑树的结构复杂,但它的操作有着良好的最坏情况运行时间,并且在实践中高效:它可以在 O(log n)时间内完成查找、插入和删除,这里的n是树中元素的数目。

红黑树性质(算法导论)

  1. 每个结点或是红色的,或是黑色的。
  2. 根结点是黑色的。
  3. 每个叶子结点(NIL)是黑色的。
  4. 如果一个结点是红色的,则它的两个子结点都是黑色的。
  5. 对每个结点,从该结点到其所有后代叶结点的简单路径上,均包含相同数目的黑色结点(黑高)。

红黑树插入

红黑树插入结点必须标记为红色,我们首先以二叉查找树的方法增加节点并标记它为红色。当插入结点以后,可能会影响到红黑树的性质,这时需要通过变色或者旋转来进行平衡。如果插入结点存在相同结点,则只需要替换值即可,此时不影响红黑树性质。

插入结点

以二叉查找树的方式插入新节点。
插入新节点代码:

    public void insert(T key) {
   
        // 根节点,直接插入
        if (root == null) {
   
            root = new Node<>(key);
        } else {
   
            // 当前循环节点
            Node<T> x = root;
            // 最后一个循环的节点
            Node<T> p = x;
            while (x != null) {
   
                p = x;
                int tmp = key.compareTo(x.key);
                // key比x大,插入到右子树
                if (tmp > 0) {
   
                    x = 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值