Функция удаления бинарного дерева поиска, стирающая все дерево - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь написать класс BST, но метод delete кажется неправильным (или, возможно, одним из его поддерживающих методов), так как вызов его для любого элемента приводит к тому, что root становится нулевым. Может кто-нибудь, пожалуйста, помогите выяснить, где проблема?

public void delete(DynamicSetBST T, Node z) {
    if(z.left == null) {
        transplant(T, z, z.right);
    }else if(z.right == null) {
        transplant(T, z, z.left);
    }else {
        Node y = successor(z.right);
        if(!y.p.equals(z)) {
            transplant(T, y, y.right);
            y.right = z.right;
            y.right.p = y;
        }
        transplant(T, z, y);
        y.left = z.left;
        y.left.p = y;
    }
}

public void transplant(DynamicSetBST T, Node u, Node v) {
    if(u.p == null) {
        T.root = v;
    }else if(u.equals(u.p.left)) {
        u.p.left = v;
    }else {
        u.p.right = v;
    }
    if(v != null) {
        v.p = u.p;
    }
}

public Node successor(Node x) {
    if(x.right != null) {
        return min(x.right);
    }
    Node y = x.p;
    while(y != null && x.equals(y.right)) {
        x = y;
        y = y.p;
    }
    return y;
}
...