Jobb Threading egy bináris fa

szavazat
0

Most van egy pokoli időt, hogy kitaláljam ezt ki. Mindenütt nézek, úgy tűnik, hogy csak fut be magyarázatot, hogyan kell valóban áthaladhat a lista nem rekurzív (az I. rész tulajdonképpen érthető). Tud valaki ott kalapács pontosan hogyan tudok átmenni a listán először, és megtalálni a tényleges előd / utód csomópontok így tudok zászló őket a csomópont osztályban? Azt kell tudni, hogy egy egyszerű bináris keresés Fa és végig a listát, és átirányítani a null linkek az előd / utód. Elegem van némi szerencsével a megoldás valamivel, mint a következő:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
A kérdést 29/07/2009 19:11
a forrás felhasználó
Más nyelveken...                            


1 válasz

szavazat
1

A saját leírás, feltételezem, hogy van egy csomópont, amelynek szerkezete keres valamit, mint:

Node {
  left
  right
}

... és hogy van egy bináris fa ilyen felállás a bal és jobb oldalon, hogy szeretné újra hozzá értékeket a bal és jobb, mint az, hogy létrehoz egy doublely kapcsolt lista mélyről bejárást a fa.

A gyökér (nem szójáték szándékozott) probléma azzal, amit kapott eddig, hogy a „csomó p” (rövid előző?) Átadott során bejárás függetlennek kell lennie, ahol a fa is legyenek - mindig tartalmaznia kell a korábban meglátogatott csomópontot. Ehhez minden alkalommal szál fut azt kell hivatkozni ugyanazt a „korábbi” változó. Tettem Python-szerű pszeudo-kód egy C-izmus - ha nem ismeri, „ és ” az „utalás” (vagy „ref” C #) és a „*” „dereference és adj az objektum akkor mutat”.

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

Ha mentek, hogy végre ezt a C, azt valóban szükség van egy dupla mutatót, hogy tartsa a referencia, de az ötlet ugyanaz - meg kell fennállnak a helyét az „utolsó meglátogatott node” alatt a teljes bejárás.

Válaszolt 31/07/2009 05:36
a forrás felhasználó

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