Znaleźć następcę bez użycia wskaźnika nadrzędnego

głosy
1

Następca elementu w BST jest następcą elementu w kolejności posortowanej ustalonej przez przechodzenie inorder. Znalezienie następcy gdy każdy węzeł ma wskaźnik do swojego węzła nadrzędnego jest przedstawiony w CLR męska algorytmu podręcznika (Wprowadzenie do algorytmów przez MIT Press).

Pomysł, aby znaleźć następcę tutaj jest - jeśli prawo poddrzewo węzła xjest niepusty, następca xjest minimalna elementu w prawym poddrzewie. W przeciwnym razie, następca jest najniższy przodka x, którego lewy dziecko jest również przodkiem x(zakładając, że węzeł jest przodkiem sobie).

Możemy znaleźć następcę bez użycia wskaźnika do węzła nadrzędnego?

Czasami nasz węzeł drzewa nie ma tego wskaźnika. Walczyłem kilka godzin, ale nie można napisać poprawny kod.

Utwórz 26/09/2010 o 00:39
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
0

Jeśli nie masz dostępu do wskaźnika do węzła nadrzędnego, to musisz wiedzieć, kto jest ojcem. Jeśli nie wiesz, jak można iść w górę w drzewie?

Odpowiedział 26/09/2010 o 00:55
źródło użytkownik

głosy
2

To powinno działać:

TREE-SUCCESSOR(T, x)
  if right[x] != NIL
    return TREE-MINIMUM(right[x])
  else
    return FIND-TREE-SUCCESSOR(root[T], x, NIL)

FIND-TREE-SUCCESSOR(y, x, c)
  if y = x
    return c
  if key[x] < key[y]
    return FIND-TREE-SUCCESSOR(left[y], x, y)
  else
    return FIND-TREE-SUCCESSOR(right[y], x, c)

FIND-TREE-SUCCESSORutrzymuje c(kandydata) ostatni węzeł, w którym my skręciliśmy w lewo.

Odpowiedział 26/09/2010 o 01:15
źródło użytkownik

głosy
5

Zainspirowany rozwiązania Sheldona, to nierekursywnych wersja rozwiązania.


if (right[x]  != NIL)
    return min(right[x]);
else
{
    candidate = NIL;
    y = root; 
    while  (y!= x) // y is used as a probe
if (key[x] < key[y]) { candidate = y; y = y ->left;
} else y = y->right; } return candidate;
Jeśli kandydat == NIL, x jest max w drzewie i nie ma następcy.

Odpowiedział 26/09/2010 o 18:17
źródło użytkownik

głosy
1

Znalazłem eleganckie rozwiązanie w zamówienie następcy bez wskaźnika dominującej tutaj -> http://www.geeksforgeeks.org/archives/9999

Chodzi o to,

1.If węzeł ma prawo sub-tree, potem jego następca jest najmniejszym elementem w odpowiednim sub-tree

  1. Jeśli prawo sub-tree węzła jest pusta, to jego następca jest jednym z jego przodków, które można znaleźć odgórnie bez wskaźnika dominującej, z następującym algorytmem:

niech początkowo current_node być korzeń, succ_node = null;

Przypadek 1: Jeśli element wyszukiwania jest mniej niż current_node, wówczas prąd elementem jest potencjalny następca - miejsce succ_node na current_node i przesunąć current_node na jej lewym węzłem (ponieważ element wyszukiwania znajduje się w lewym poddrzewie)

Przypadek 2: Jeśli element wyszukiwania jest większa niż current_node, jego potencjalny następca nie (jak może być w mniejszym elementem następcę?). Więc nie ma potrzeby, aby umieścić succ_node tutaj, ale przesunąć current_node do prawej.

powtarzać ten proces, aż dojdziesz null lub sam element i zwraca succ_node.

Odpowiedział 13/09/2012 o 01:17
źródło użytkownik

głosy
0

Rekurencyjna rozwiązanie Java może wyglądać w następujący sposób:

public Integer successor(Integer value) {
    Node n = succ(root, value, null);
    if (null != n) {
       return n.value;
    }
    return null;
}

private Node succ(Node n, Integer x, Node p) {
    if (null == n) {
        return null;
    }

    if (x < n.value) {
        return succ(n.left, x, n);
    } else if (x > n.value) {
        return succ(n.right, x, p);
    }
    if (null != n.right) {
        return min(n.right);
    }
    return p;
}

Jako klient po prostu przekazać wartości węzła, z którego chcemy poznać następcę. Następnie rozpocząć wyszukiwanie od korzenia aż okazało się, że wartość szukaliśmy. Obecnie istnieją dwa przypadki:

  1. Jeśli bieżący węzeł ma prawo dziecka, następnie następcę najmniejszy element w bieżącym prawym poddrzewie węzła
  2. W przeciwnym razie, to węzeł p (wskaźnik rodzic), która została tylko zaktualizowane kiedy poszliśmy w lewo w drzewo
Odpowiedział 09/09/2013 o 17:41
źródło użytkownik

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more