其他主控永远不会在树形图的后继者()中受到谴责

时间:2019-02-14 08:35:40

标签: 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;
        p = s;
}

}

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;
    }
}

我对deleteEntry函数感到困惑,p有2个孩子。 P.left和P.right全部  不为空。  但是为什么要判断后继功能中t.right不为空呢?  我的意思是绝对的事实。而且因为t.right必须是  不为空。在后续功能中,代码永远不会在其他主服务器中被执行。

谁打电话告诉我我的问题在哪里?谢谢大家。

1 个答案:

答案 0 :(得分:0)

如果查看TreeMap.java,您将知道从很多地方都调用了后继者,delete()就是这样的地方。