Не удается изменить корневой указатель в дереве AVL [Java]

#java #binary-search-tree #avl-tree

Вопрос:

У меня возникли проблемы с изменением корневого указателя моего дерева AVL, независимо от того, является ли это операцией поворота или простым удалением.

Приведенный ниже код предназначен для удаления. если я попытаюсь удалить корень дерева, когда у него нет дочерних элементов (node = null), ничего не произойдет. если я попытаюсь «удалить» корень с дочерним элементом (с помощью setValue()), значение корня изменится (и несколько сработает), но сам объект не изменится, и это не идеально.

 NodeBal delete(NodeBal node, int key) {
    if (node == null) {
        return node;
    } else if (node.getValue() > key) {
        node.setLeft(delete(node.getLeft(), key));
    } else if (node.getValue() < key) {
        node.setRight(delete(node.getRight(), key));
    } else {
        if (node.getLeft() == null || node.getRight() == null) {
            System.out.println("delete() DEBUG: "   (node == this.root));
            node = (node.getLeft() == null) ? node.getRight() : node.getLeft();
        } else {
            NodeBal mostLeftChild = mostLeftChild(node.getRight());
            node.setValue(mostLeftChild.getValue());
            node.setRight(delete(node.getRight(), node.getValue()));
        }
    }
    if (node != null) {
        node = rebalance(node);
    }
return node;
}
 

то же самое происходит и с вращениями:

 public NodeBal rotateRight(NodeBal y) {
    /*
                 Y     
                /                   X
               X   A                / 
              /         --->      Z   Y
             Z   B                /  / 
            /                   D  C B  A
           D   C
    */
    /*
    
    */
    System.out.println("[!] Rotating right. Pivot: "   y.getValue());
    NodeBal x = y.getLeft();
    NodeBal c = x.getRight();
    NodeBal p = fetchParentOf(y.getValue());
    x.setRight(y);
    y.setLeft(c);
    if (p != null){
        p.setLeft(x);
    }
    updateBalance(y);
    updateBalance(x);
    return x;
}
 

возьмем эту операцию балансировки в качестве примера:

            5 <- Root             (Desired)                  (Actual)
          /                          4 <- New root             5
         4     Rotate right 5 -->   /              -->       / 
        /                          3   5 <- Old root         n   n <- nulls
       3
 

Узлы 3 и 4 «исчезли». возможно, потому, что печать (и почти все другие функции) начинаются с корневого узла. узлы 3 и 4 не показаны, потому что они недоступны с 5.

полный код доступен на моем github. Спасибо за чтение!