Java 否则,将永远不会在树映射的继承者()中执行master
我正在学习treemap中remove()的源代码。但有件事我不明白 //忽略主要代码,保留这些Java 否则,将永远不会在树映射的继承者()中执行master,java,treemap,Java,Treemap,我正在学习treemap中remove()的源代码。但有件事我不明白 //忽略主要代码,保留这些 private void deleteEntry(Entry<K,V> p) { if (p.left != null && p.right != null) { Entry<K,V> s = successor(p); p.key = s.key; p.value = s.value;
private void deleteEntry(Entry<K,V> p) {
if (p.left != null && p.right != null) {
Entry<K,V> s = successor(p);
p.key = s.key;
p.value = s.value;
p = s;
}
private void deleteEntry(条目p){
如果(p.left!=null和&p.right!=null){
条目s=后继项(p);
p、 key=s.key;
p、 值=s.值;
p=s;
}
}
static TreeMap.Entry后继项(Entry t){`在这里输入代码`
如果(t==null)
返回null;
else if(t.right!=null){
条目p=t.右;
while(p.left!=null)
p=p.左;
返回p;
}否则{
条目p=t.parent;
输入ch=t;
while(p!=null&&ch==p.right){
ch=p;
p=p.parent;
}
返回p;
}
}
我对deleteEntry函数感到困惑,p有两个孩子。左,右,好的
它们不是空的。
但为什么它会判断t.right在后继函数中不是空的呢?
我的意思是这是绝对的事实。因为t.right必须是正确的
不为空。在后继函数的else master中永远不会执行代码
谁打电话告诉我哪里有问题?谢谢大家。如果您查看TreeMap.java,就会知道继任者将从许多地方被调用,delete()就是这样一个地方。那又怎样?那是唯一一个调用
继任者的地方吗?要对succession
的极端案例进行推理,你不能只看一个调用方,你必须看所有可能的调用方。谢谢各位。我真的很感激。
static <K,V> TreeMap.Entry<K,V> successor(Entry<K,V> t) {`enter code here`
if (t == null)
return null;
else if (t.right != null) {
Entry<K,V> p = t.right;
while (p.left != null)
p = p.left;
return p;
} else {
Entry<K,V> p = t.parent;
Entry<K,V> ch = t;
while (p != null && ch == p.right) {
ch = p;
p = p.parent;
}
return p;
}
}