Еще мастер никогда не будет оправдан в successor () в древовидной карте - PullRequest
0 голосов
/ 14 февраля 2019

Я изучаю исходный код функции 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 должен быть не нулевым.Коды никогда не выполняются в главном мастере в функции преемника.

Кто звонит, скажите мне, где моя проблема?Спасибо, ребята.

1 Ответ

0 голосов
/ 14 февраля 2019

Если вы посмотрите на TreeMap.java, вы узнаете, что преемник вызывается из многих мест, delete () - только одно из таких мест.

...