左旋的本质:
先将形参节点的右节点的左节点 作为 形参节点的右节点
后将形参节点作为后形参节点原本的右节点的左节点
这俩步之后后 引起的一系列操作----即需要考虑的问题如下:-----假定形参的右节点一定存在
此时形参原本右节点的父节点空缺出来了---需要赋值
形参节点的右节点的左节点是否存在:
不管存不存在都要将该节点的值赋值给 形参节点的右节点
不存在如何:为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;
}
}
第四道流程的结果: