Høyre Threading et binært tre

stemmer
0

Jeg har en helvetes tid på å prøve å finne dette ut. Overalt hvor jeg ser, synes jeg å være bare kjøre inn forklaringer på hvordan du faktisk traversere gjennom listen ikke-rekursivt (den delen jeg faktisk forstår). Kan noen der ute hamre i hvordan akkurat jeg kan gå gjennom listen først, og finne den faktiske forgjenger / etterfølger noder slik at jeg kan flagge dem i nodeklassen? Jeg må være i stand til å lage en enkel binært søketre og gå gjennom listen og omdirigere null linker til forgjengeren / etterfølger. Jeg har hatt litt flaks med en løsning noe som følgende:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Publisert på 29/07/2009 klokken 18:11
kilden bruker
På andre språk...                            


1 svar

stemmer
1

Fra din beskrivelse, vil jeg anta at du har en node med en struktur ser omtrent slik ut:

Node {
  left
  right
}

... og at du har et binært tre av disse satt opp ved hjelp av venstre og høyre, og at du ønsker å re-tildele verdier til venstre og høyre slik at det skaper en doublely bundet-liste fra en dybde først traversering av tre.

Roten (no pun intended) problem med det du har fått så langt er at "node p" (forkortelse for tidligere?) Som er gått under traversering må være uavhengig av hvor i treet du er nå - det alltid må inneholde den tidligere besøkt noden. For å gjøre det, er hver gang tråden kjøre den trenger å referere til samme "forrige" variable. Jeg har gjort noen Python-ish pseudokode med en C-isme - hvis du ikke er kjent, ' & ' betyr "referanse til" (eller "ref" i C #), og '*' betyr "deferanseoperasjon og gi meg objektet den peker til".

Node lastVisited
thread(root, &lastVisisted)

function thread(node, lastVisitedRef)
  if (node.left)
    thread(node.left, lastVisitedRef)
  if (node.right)
    thread(node.right, lastVisitedRef)

  // visit this node, reassigning left and right
  if (*lastVisitedRef)
    node.right = *lastVisitedRef
    (*lastVisitedRef).left = node
  // update reference lastVisited
  lastVisitedRef = &node

Hvis du skulle implementere dette i C, vil du faktisk trenger en dobbel pekeren å holde referanse, men ideen er den samme - du trenger å vedvare plasseringen av "sist besøkte node" under hele traversering.

Svarte 31/07/2009 kl. 04:36
kilden bruker

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