Dreptul Threading un arbore binar

voturi
0

Am un iad de un timp încercând să dau asta afară. Oriunde mă uit, mi se pare a fi difuzate în explicații numai cu privire la modul de a traversa de fapt, prin lista non-recursiv (partea de fapt, am înțeles). Poate cineva acolo ciocan exact cum pot merge prin lista inițial și pentru a găsi real predecesorul / succesorul nodurile așa că pot pavilion le în clasa nod? Trebuie să fie capabil de a crea un simplu binar arbore de căutare și du-te prin listă și redirijarea link-urile nule la predecesorul / succesorul. Am avut ceva noroc cu o soluție oarecum ca următoarele:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
Întrebat 29/07/2009 la 19:11
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
1

Din descrierea ta, am să presupun că ai un nod cu o structură în căutarea ceva de genul:

Node {
  left
  right
}

... și că aveți un arbore binar de acestea cu ajutorul creat din stânga și din dreapta, pe care doriți să le reatribui valori la stânga și la dreapta, astfel încât se creează o listă doublely-legat de la o adâncime mai întâi a traversal copac.

Rădăcina (nu joc de cuvinte destinate) , problema cu ceea ce ai până acum este că „nodul p“ (prescurtarea de la anterioare?) , Care este trecut în timpul traversal trebuie să fie independentă de cazul în care în copac vă aflați în prezent - întotdeauna trebuie să conțină nodul vizitat anterior. Pentru a face acest lucru, fiecare fir de timp se execută aceasta trebuie să facă trimitere la aceeași variabilă „anterioară“. Am făcut un cod pseudo-Python ish cu un C-ism - dacă nu sunteți familiarizați, „ & “ înseamnă „trimitere la“ (sau „ref“ în C #), și „*“ înseamnă „endiancu și dă - mi obiectul este îndreptat spre“.

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

Dacă ați fost de gând să pună în aplicare acest lucru în C, ai nevoie de fapt un pointer dublu de a deține referința, dar ideea este aceeași - trebuie să persiste locația „ultimul nod vizitat“ pe parcursul întregii traversal.

Publicat 31/07/2009 la 05:36
sursa de către utilizator

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