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.