我正在学习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必须是 不为空。在后续功能中,代码永远不会在其他主服务器中被执行。
谁打电话告诉我我的问题在哪里?谢谢大家。
答案 0 :(得分:0)
如果查看TreeMap.java,您将知道从很多地方都调用了后继者,delete()就是这样的地方。