Я изучаю исходный код функции 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, у р 2 детей.P.left и P.right не все равны нулю.но почему доза судит о том, что право не является пустым в функции преемника?Я имею в виду, что это абсолютный факт.И потому что t.right должен быть не нулевым.Коды никогда не выполняются в главном мастере в функции преемника.
Кто звонит, скажите мне, где моя проблема?Спасибо, ребята.