Vind de opvolger zonder gebruik te maken ouder pointer

stemmen
1

De opvolger van een element in een BST is opvolger van het element in de gesorteerde volgorde bepaald door de inorder traversal. Het vinden van de opvolger bij elk knooppunt heeft een pointer naar het bovenliggende knooppunt wordt gepresenteerd in CLRS het algoritme leerboek (Introduction to Algorithms door MIT Press).

Het idee om de opvolger hier te vinden is - als de rechter deelboom van knoop xniet leeg, de opvolger van xhet minimum element in de rechter deelboom. Anders is de opvolger de laagste voorouder van xwie linkerkind ook een voorouder van x(uitgaande van een knooppunt een voorouder van zelf).

Kunnen we de opvolger zonder gebruik te maken van de aanwijzer naar het bovenliggende knooppunt vinden?

Soms zijn onze boom knooppunt beschikt niet over deze pointer. Ik worstelde een paar uur, maar kan de juiste code niet schrijven.

De vraag is gesteld op 26/09/2010 om 00:39
bron van user
In andere talen...                            


5 antwoorden

stemmen
0

Als u geen toegang tot de aanwijzer naar het bovenliggende knooppunt hebt dan moet je weten wie de vader is. Als je het niet weet, hoe kon je omhoog gaat in de boom?

antwoordde op 26/09/2010 om 00:55
bron van user

stemmen
2

Dit zou moeten werken:

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-SUCCESSORhoudt in c(kandidaat) de laatste knooppunt waar we naar links gewend.

antwoordde op 26/09/2010 om 01:15
bron van user

stemmen
5

Geïnspireerd door de oplossing Sheldon's, dit is de niet-recursieve versie van de oplossing.


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;
Als kandidaat == NIL, x is het maximum in de boom en beschikt niet over een opvolger.

antwoordde op 26/09/2010 om 18:17
bron van user

stemmen
1

Ik vond een elegante oplossing voor in-order opvolger zonder ouder pointer hier -> http://www.geeksforgeeks.org/archives/9999

idee is

1.Als het knooppunt juiste subboom, dan zijn opvolger is het minst element in de rechter subboom

  1. Als rechter deelboom van het knooppunt leeg is, dan zijn opvolger is één van zijn voorouders, te vinden bovenaf zonder ouder pointer, met het volgende algoritme:

Laat aanvankelijk HUIDIGE wortel, succ_node = null;

Scenario 1: Als het zoekelement minder dan HUIDIGE is, wordt de huidige element een mogelijke opvolger - plaats succ_node de HUIDIGE en beweeg de HUIDIGE links daarvan knooppunt (omdat het zoekelement in de linker deelboom)

Scenario 2: Als de zoektocht element groter is dan HUIDIGE, het is niet een potentiële opvolger (Hoe kan een mindere element zijn opvolger?). Dus geen noodzaak om de succ_node hier te plaatsen, maar haal de HUIDIGE naar rechts.

blijven herhalen het proces totdat u null bereiken of het element zelf en de terugkeer van de succ_node.

antwoordde op 13/09/2012 om 01:17
bron van user

stemmen
0

Een recursieve Java oplossing zou kunnen kijken op de volgende manier:

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

Als een klant passeren we gewoon in de waarde van het knooppunt van waaruit we willen de opvolger te leren kennen. Dan kunnen we beginnen zoeken vanaf de wortel tot we de waarde die we zochten gevonden. Nu zijn er twee gevallen:

  1. Als het huidige knooppunt heeft het recht kind, dan is de opvolger van het kleinste element in de rechter deelboom de huidige node
  2. Anders was het knooppunt p (ouder pointer), die alleen werd bijgewerkt toen we vertrokken in de boom
antwoordde op 09/09/2013 om 17:41
bron van user

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