Pravá Threading binární strom

hlasů
0

Mám sakra času se snaží přijít na tohle ven. Všude, kam se podíváte, zdá se mi, být jen běh do vysvětlení o tom, jak vlastně procházet seznamem nerekurzivně (část I vlastně rozumět). Může tam někdo kladivem v tom, jak přesně mohu projít seznam zpočátku a najít skutečný předchůdce / následník uzly, takže můžu vlajku jim ve třídě uzlu? Musím být schopni vytvořit jednoduchý strom binárního vyhledávání a projít seznam a přesměrovat null odkazy na předchůdce / následník. Měl jsem trochu štěstí s roztokem poněkud jako následující:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Položena 29/07/2009 v 19:11
zdroj uživatelem
V jiných jazycích...                            


1 odpovědí

hlasů
1

Z vašeho popisu, budu předpokládat, že máte uzel s konstrukcí hledá něco jako:

Node {
  left
  right
}

... a že máte binární strom z nich nastavit pomocí levé a pravé, a že chcete znovu přiřadit hodnoty vlevo a vpravo tak, že vytváří doublely připojený seznam z hloubky první průchod strom.

Kořen (žádná slovní hříčka určena), problém s tím, co jste se dostal tak daleko, že je „uzel p“ (zkratka pro předchozí?), Který je předán při přejíždění musí být nezávislý na tom, kde ve stromu se právě nacházíte - vždycky musí obsahovat dříve navštívených uzel. K tomu, že pokaždé, když vlákno je běh je třeba odkazovat na stejnou „předchozí“ proměnnou. Udělal jsem nějaké Python-ish pseudo kód s jedním C-ismus - pokud nejste obeznámeni, ‚ a ‘ znamená „odkaz na“ (nebo „ref“ v jazyce C #), a ‚*‘ znamená „dereference a dej mi objekt je směřující k“.

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

Pokud jste se bude provádět toto v jazyce C, měli byste skutečně potřebují dvojí ukazatel držet referenci, ale myšlenka je stejná - je třeba vytrvat umístění „posledního navštíveného uzlu“ v průběhu celého průchod.

Odpovězeno 31/07/2009 v 05:36
zdroj uživatelem

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