Filettatura un albero binario

voti
0

Sto avendo un sacco di tempo cercando di capire questo fuori. Ovunque io guardo, mi sembra di essere in esecuzione solo in spiegazioni su come attraversare in realtà attraverso l'elenco non ricorsivo (la parte in realtà ho capito). qualcuno là fuori può martello a come esattamente posso passare attraverso la lista inizialmente e trovare il vero predecessore / successore nodi in modo che posso bandiera loro nella classe del nodo? Ho bisogno di essere in grado di creare un semplice binario Ricerca Albero e passare attraverso la lista e reindirizzare i link nulli al predecessore / successore. Ho avuto un po 'di fortuna con una soluzione un po' come la seguente:

thread(node n, node p) {
     if (n.left !=null)
        thread (n.left, n);
     if (n.right !=null) {
        thread (n.right, p);
     }
     n.right = p;
}
È pubblicato 29/07/2009 alle 19:11
fonte dall'utente
In altre lingue...                            


1 risposte

voti
1

Dalla tua descrizione, io suppone che si abbia un nodo con una struttura che assomiglia a:

Node {
  left
  right
}

... e che si dispone di un albero binario di questi impostato utilizzando destra ea sinistra, e che si desidera riassegnare i valori a destra ea sinistra in modo tale che crea un doublely-linked-list da una profondità prima attraversamento del albero.

La radice (senza destinato gioco di parole) problema con quello che hai finora è che il "nodo di p" (abbreviazione di precedenti?) Che viene passato durante l'attraversamento deve essere indipendente da dove nella struttura ci si trova - è sempre deve contenere il nodo precedentemente visitata. Per fare questo, ogni volta che viene eseguito filo deve fare riferimento alla stessa variabile "precedente". Ho fatto qualche pseudo codice Python-ish con un C-ism - se non hai familiarità, ' & ' significa "riferimento" (o "ref" in C #), e '*' significa "dereference e dammi l'oggetto si sta puntando".

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

Se si dovesse andare a implementare questo in C, si sarebbe in realtà bisogno di un doppio puntatore per contenere il riferimento, ma l'idea è la stessa - è necessario persistere la posizione del "ultimo nodo visitato" durante l'intero attraversamento.

Risposto il 31/07/2009 a 05:36
fonte dall'utente

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