Red Black Tree исправление после вставки, необычная реализация

Я работаю над проектом для класса, работающего с красно-черными деревьями, и реализация моего профессора немного странная. Мне удалось получить рекурсивную функцию вставки, с которой у меня были проблемы (см. Этот вопрос: необычная реализация Java вставки узлов красного / черного дерева)

Но теперь, что касается поворота вправо, влево и переключения, код не работает. Скажем, я ввожу 10, 8, 4. 10 и 8 появятся в графическом интерфейсе, а 4 - нет. Отладка показывает "ROTATING RIGHT", как и должно быть, но узлы не меняются в графическом интерфейсе. Мой код ниже. Я хотел бы знать, если это проблема с моим методом handleInsertion(), или это как-то связано с GUI моего профессора.

public boolean insertNode(Node node) {
    if(root==null){
        root=node;
        root.setColor(Node.BLACK);
        return true;
    }
    else
        node.setColor(Node.RED);

    return insertNode(node, root);

}

public boolean insertNode(Node node, Node cur){

    if(node.getValue()<cur.getValue()){

        if(cur.getLeft()!=null) 
            return insertNode(node, cur.getLeft());

        else{
            cur.setLeft(node);
            node.setParent(cur);
            handleInsertion(node);
            return true;    }   }

    else if(node.getValue()>cur.getValue()){

        if(cur.getRight()!=null)
            return insertNode(node, cur.getRight());

        else{
            cur.setRight(node);
            node.setParent(cur);
            handleInsertion(node);
            return true;    }   }
    else
        return false;
}

private static void handleInsertion(Node n){
    Node F;
    if(n.getParent()==null)
        return;
    else{
        n=n.getParent();
        F=n;    }

    if (exists(n.getRight())&&exists(n.getLeft())&&isRed(n.getRight()) && !isRed(n.getLeft())) n = rotateLeft(n);

    if(n.getParent()!=null)     n=n.getParent();
    if (exists(n.getLeft())&&exists(n.getLeft().getLeft())&&isRed(n.getLeft()) && isRed(n.getLeft().getLeft())) n = rotateRight(n.getLeft());
    n=F;

    if (exists(n.getLeft())&&exists(n.getRight())&&isRed(n.getLeft()) && isRed(n.getRight())) flipColors(n);

}

Я также пытался использовать реализации с оператором while и узлом дяди, но они вызывали исключения NullPointerException довольно часто и в основном давали одинаковые результаты.

Спасибо!

0 ответов

Другие вопросы по тегам