treemap的 rotateLeft(Entry<K,V> p)

左旋的本质
先将形参节点的右节点的左节点 作为 形参节点的右节点

后将形参节点作为后形参节点原本的右节点的左节点

这俩步之后后 引起的一系列操作----即需要考虑的问题如下:-----假定形参的右节点一定存在

   此时形参原本右节点的父节点空缺出来了---需要赋值
   形参节点的右节点的左节点是否存在:
       不管存不存在都要将该节点的值赋值给  形参节点的右节点
       不存在如何:为null
        存在如何:为具体的一个对象
   此时形参节点的父节点多余出来了:需要考虑该父节点是否存在?
       不管存不存在都要做形参原本右节点缺失的父节点
       存在:为一个具体的对象
       不存在:为null

其他了解:下面的了解将节点和代码联系起来了

  一个节点代表一个Entry<K,V>实例对象
  一个节点的三根线连接的值分别代表 一个Entry对象中的
  三个成员变量值:Entry<K,V> left    Entry<K,V> right   
                Entry<K,V> parent

rotateLeft(Entry<K,V> p)作用:将形参节点 作为 形参右节点的左节点

第一道流程://现在改变的是对象的成员变量的值,而并不是改变对象的值-------注:成员变量也是对象
代码有问题:没考虑形参的右节点存不存在-----这里假定存在了

private void rotateLeft(Entry<K,V> p) {
    if (p != null) {
        Entry<K,V> r = p.right;
        p.right = r.left;
        if (r.left != null)
           r.left.parent = p;
        r.parent = p.parent;
        if (p.parent == null)
                root = r;
        r.left = p;
        p.parent = r;
    }
}
流程1的解释:
当形参Entry不存在父节点  且 形参右节点的左节点存在时:
       将形参的右节点作为treemap对应数的根节点
       将形参作为  形参的右节点的左节点 :
             此时形参占用了 形参原本右节点的左节点
             形参原本右节点的左节点  多余出来了
             而形参原本右节点成了 形参节点的父节点
             形参的右节点空缺出来了
       将形参原本的右节点的左节点 作为形参节点的右节点


第一道流程的结果:
在这里插入图片描述

第二道流程://现在改变的是对象的成员变量的值,而并不是改变对象的值-------注:成员变量也是对象

private void rotateLeft(Entry<K,V> p) {
   if (p != null) {
       Entry<K,V> r = p.right;
       p.right = r.left;
       if (r.left != null)
           r.left.parent = p;
       r.parent = p.parent;
       if (p.parent == null){
            p.parent != null所以不执行这里
       }else if (p.parent.left == p){
           p.parent.left = r;
       }
       r.left = p;
       p.parent = r;         
   }
}
流程2的解释:
当形参Entry存在父节点 且 形参是其父接节点的左节点  
且  形参右节点的左节点存在时:
          将形参作为  形参的右节点的左节点 :
                此时形参占用了 形参原本右节点的左节点
                形参原本右节点的左节点  多余出来了
                而形参原本右节点成了  形参节点的父节点
                形参的右节点空缺出来了
                形参的父节点多余出来了
                形参原本右节点缺了父节点
           将形参原本的右节点的左节点 作为形参节点的右节点
           将形参原本的右节点以左节点的身份作为形参原本父节点左节点

第二道流程的结果:
在这里插入图片描述
第三道流程://现在改变的是对象的成员变量的值,而并不是改变对象的值-------注:成员变量也是对象

private void rotateLeft(Entry<K,V> p) {
   if (p != null) {
       Entry<K,V> r = p.right;
       p.right = r.left;
       if (r.left != null)
           r.left.parent = p;
       r.parent = p.parent;
       if (p.parent == null){
            p.parent != null所以不执行这里
       }else if (p.parent.left == p){
           p.parent.left != p所以不执行这里
       }else{
           p.parent.right = r;
       }
       r.left = p;
       p.parent = r;          
   }
}
流程3解释
 当形参Entry存在父节点  且  形参是其父接节点的右节点 
 且 且  形参右节点的左节点存在 时:
          将形参作为  形参的右节点的左节点 :
                此时形参占用了 形参原本右节点的左节点
                    所以形参原本右节点的左节点  多余出来了
                而形参原本右节点成了  形参节点的父节点:
                    形参的右节点空缺出来了
                   形参的父节点多余出来了
                   形参的原本右节点缺了父节点
           将形参原本的右节点的左节点 作为形参节点的右节点
           将形参原本的右节点以右节点的身份作为形参原本父节点右节点

第三道流程的结果:
在这里插入图片描述
第四道流程://现在改变的是对象的成员变量的值,而并不是改变对象的值-------注:成员变量也是对象

private void rotateLeft(Entry<K,V> p) {
   if (p != null) {
       Entry<K,V> r = p.right;
       p.right = r.left;
       if (r.left != null){
           r.left == null,所以不执行
       }
       r.parent = p.parent;
       if (p.parent == null)
           root = r;
       r.left = p;
       p.parent = r;
   }
}

第四道流程的结果:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值