Java 否则,将永远不会在树映射的继承者()中执行master

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;

我正在学习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;
        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;
    }
}