Drzewo BST - algorytm usuwania elementu

0

Mam taki algorytm, (wzorowany z książki Cormena o algorytmach):

    public void tree_delete(Node D, Node v) {
        Node y = null;
        Node x = null;
        if (v.left_son == null || v.right_son == null) {
            y = v;
        } else {
            y = tree_next(v);
        }
        if (y.left_son != null) {
            x = y.left_son;
        } else {
            x = y.right_son;
        }
        if (x != null) {
            x.rodzic = y.rodzic;
        }
        if (y == null) {
            D.korzen = x;
        } else {
            if (y == y.rodzic.left_son) {
                y.rodzic.left_son = x;
            } else {
                y.rodzic.right_son = x;
            }
            if (y != v) {
                v.wartosc = y.wartosc;
            }
        }
    }

Czy ktoś mi może powiedzieć, czemu nie działa prawidłowo?
I jak zrobić aby działał?

Problemem jest usuwanie elementu, który ma rodzica i dwoje dzieci(w innych przypadkach raczej działa):
czyli, jakoś tak to wygląda:

1
  3
 2 4

W tym przykładzie, usuwam element '3', i usuwa się ale tracę powiązanie, czyli wtedy wygląda to tak:

1

 2 4

Zamiast:

1
  4
 2

Co z tym jest nie tak?

0

Może to być problem w treenext

0

Ta metoda też jest na podstawie tej książki i wiadomości z internetu:

    public Node tree_next(Node x) {
        Node y = null;
        if (x.right_son != null) {
            return tree_min(x.right_son);
        }
        y = x.korzen;
        while (y != null && x == y.right_son) {
            x = y;
            y = y.rodzic;
        }
        return y;
    }

Ta metoda zwraca wartość '4', czyli prawidłowe ze tego co mi wiadomo!
Podejrzewam, że to właśnie w metodzie 'delete' coś jest nie tak, bądz czegoś brakuje!

0

Nikt nie miał podobnych problemów z drzewem BST?

1 użytkowników online, w tym zalogowanych: 0, gości: 1