Najít nástupce bez použití nadřazený ukazatel

hlasů
1

Nástupce prvku v BST je prvek nástupce v tříděném pořadí podle nezbytného průchod. Nalezení nástupce, kdy každý uzel má ukazatel na jeho nadřazeného uzlu je uveden v CLRS algoritmus učebnici (Úvod do algoritmů od MIT Press).

Myšlenka najít nástupce zde je - v případě, že pravý podstrom uzlu xje neprázdná, nástupce xje minimální prvek v pravém podstromu. V opačném případě je nástupcem je nejnižší předchůdce x, jehož levá dítě je také předchůdce x(za předpokladu, že uzel je předek sám o sobě).

Najdeme nástupce bez použití ukazatel nadřazeného uzlu?

Někdy náš strom node nemá tento ukazatel. Snažil jsem se pár hodin, ale nelze zapisovat správný kód.

Položena 26/09/2010 v 00:39
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
0

Nemáte-li mít přístup k ukazatel nadřazeného uzlu, pak je třeba vědět, kdo je otec. Pokud nechcete vědět, jak byste mohli jít do stromu?

Odpovězeno 26/09/2010 v 00:55
zdroj uživatelem

hlasů
2

To by mělo fungovat:

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-SUCCESSORudržuje c(uchazeče) poslední uzel, ve kterém jsme odbočil doleva.

Odpovězeno 26/09/2010 v 01:15
zdroj uživatelem

hlasů
5

Inspirovaný Sheldon roztok, to je non-rekurzivní verze řešení.


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;
Pokud kandidát == NIL, x je maximální ve stromové struktuře a nemá nástupce.

Odpovězeno 26/09/2010 v 18:17
zdroj uživatelem

hlasů
1

Zjistil jsem, elegantní řešení pro in-pořadí nástupce bez mateřské ukazatelem zde -> http://www.geeksforgeeks.org/archives/9999

myšlenka je

1. Pokud je uzel má právo sub-strom, pak jeho nástupce je nejmenší prvek v pravém podstromu

  1. Pokud uzel má pravdu sub-strom je prázdný, pak jeho nástupce je jedním z jeho předků, které lze nalézt shora dolů bez nadřazeného ukazatel, podle následujícího algoritmu:

nechat nejprve current_node být root, succ_node = null;

Případ 1: Není-li vyhledávací prvek je menší než current_node, pak je aktuální prvek je potenciální nástupce - místo succ_node na current_node a přesunout current_node k jeho levé uzlu (protože hledání element je v levém podstromu)

Případ 2: Pokud je hledání element je větší než current_node, není jeho potenciální nástupce (Jak může být menší element být nástupce?). Takže není třeba umístit succ_node tady, ale přesunout current_node doprava.

neustále opakují proces, dokud se nedostanete null nebo samotný prvek a vrátí succ_node.

Odpovězeno 13/09/2012 v 01:17
zdroj uživatelem

hlasů
0

Rekurzivní řešení Java může vypadat následujícím způsobem:

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 se jednoduše složit v hodnotě uzlu, ze kterého chceme znát nástupce. Pak jsme začít hledat od kořenu až jsme našli hodnotu, kterou hledali. Nyní existují dva případy:

  1. Je-li aktuální uzel má pravý dítě, pak nástupce nejmenší prvek v pravém podstromu aktuálního uzlu
  2. Jinak bylo uzel p (rodič pointer), který byl aktualizován pouze tehdy, když jsme šli vlevo ve stromu
Odpovězeno 09/09/2013 v 17:41
zdroj uživatelem

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