Keresse meg a jogutód nélkül szülő pointer

szavazat
1

Az utódja egy elem a BST az elem utódja a rendezett által meghatározott sorrendben inorder bejárása. Megtaláljuk a jogutód, amikor minden csomópont egy pointert a szülő csomópont kerül bemutatásra CLR-algoritmus tankönyv (Bevezetés az algoritmusok MIT Press).

Az ötlet, hogy megtalálják a jogutód itt - ha a megfelelő részfáját csomópont xnem üres, az utódja xa legkisebb eleme a jobb részfa. Ellenkező esetben az utód a legalacsonyabb őse x, melynek bal gyermek is az őse x(feltételezve, hogy egy csomópont egy őse is).

Találunk a jogutód nélkül a mutatót szülőcsomópont?

Néha a fa csomópont nem rendelkezik ez a mutató. Küzdöttem egy pár órát, de nem tud írni a helyes kódot.

A kérdést 26/09/2010 00:39
a forrás felhasználó
Más nyelveken...                            


5 válasz

szavazat
0

Ha nem fér hozzá a mutatót szülőcsomópont akkor meg kell tudni, hogy ki az apa. Ha nem tudod, hogyan megy fel a fára?

Válaszolt 26/09/2010 00:55
a forrás felhasználó

szavazat
2

Ennek működnie kell:

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-SUCCESSORtart c(jelölt) az utolsó csomópont, ahol balra fordultunk.

Válaszolt 26/09/2010 01:15
a forrás felhasználó

szavazat
5

Ihlette Sheldon megoldás, ez a nem-rekurzív változata a megoldás.


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;
Ha jelölt == NIL, x max a fa és nincs utódja.

Válaszolt 26/09/2010 18:17
a forrás felhasználó

szavazat
1

Azt találtam elegáns megoldást a-érdekében utódja anélkül eredeti mutatója itt -> http://www.geeksforgeeks.org/archives/9999

ötlet

1.Ha a csomópont jobb sub-tree, majd annak utódja a legkevésbé eleme a megfelelő al-fa

  1. Ha a csomópont jobb részfa üres, majd annak utódja egyike az ősök, amely megtalálható a top-down nélkül eredeti mutatója, a következő algoritmus:

hagyja kezdetben current_node root, succ_node = null;

1. eset: Ha a keresési elem kisebb current_node, akkor az aktuális elem egy lehetséges utódja - hely succ_node a current_node és mozgassa a current_node tőle balra csomópont (mert a keresési elem a bal oldali részfa)

2. eset: Ha a keresési elem nagyobb, current_node, hogy nem egy potenciális utódját (Hogyan lehet egy kisebb eleme lesz az utódja?). Így nem kell elhelyezni a succ_node itt, de vigye a current_node jobbra.

folyamatosan ismétlődő folyamat, amíg el nem éri null vagy magát az elemet, és visszatér a succ_node.

Válaszolt 13/09/2012 01:17
a forrás felhasználó

szavazat
0

A rekurzív Java megoldás lehet nézni a következő módon:

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;
}

Mint ügyfél egyszerűen át a értéke a csomópont, ahonnan szeretnénk tudni, hogy az utódja. Aztán elkezdi keresni a gyökér, amíg megtaláltuk az értéket kerestünk. Most van két esetben:

  1. Ha az aktuális csomópont joga van gyermeke, akkor az utódja a legkisebb eleme a jelenlegi csomópont jobb részfa
  2. Egyébként ez volt a csomópont p (szülő pointer), amelyet csak akkor frissíti mentünk elhagyta a fán
Válaszolt 09/09/2013 17:41
a forrás felhasználó

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