calcolare la lunghezza del cammino interno di un BST solo in preordine o postorder attraversamento

voti
3

Ciao StackOverflow comunità!

Sto cercando di capire come calcolare la lunghezza del cammino interno di BST dato solo il preordine o postorder attraversamento (non dovrebbe fare molta differenza) senza costruire l'albero; cioè, io voglio usare solo uno di attraversamenti di cui sopra. Questo può essere una risposta semplice alla maggior parte di voi, ma come si potrebbe avere già pensato io sono abbastanza nuovo gli alberi.

Ebbene ogni pensiero è apprezzato e grazie.

È pubblicato 23/02/2011 alle 06:01
fonte dall'utente
In altre lingue...                            


3 risposte

voti
-1

Se ho ben capito il problema potrebbe non essere possibile. Consideriamo i due alberi

   A         A
  / \        |
 B   C       B
             |
             C

Questi hanno la stessa attraversamento preorder (ABC) ma differenti lunghezze di percorso interno (2 e 3).

Risposto il 23/02/2011 a 06:44
fonte dall'utente

voti
0

C'è una pagina alla http://geeksforgeeks.org/?p=6633 che discute la costruzione di un albero dalla sua preordine e in ordine attraversamenti. Qui, dal momento che il vostro albero è un albero di ricerca, si ha l'attraversamento in ordine implicito (usando l'ordinamento delle chiavi). È possibile utilizzare un algoritmo ricorsivo come quello in quel sito per calcolare il livello di ogni nodo della struttura (senza bisogno di costruire l'albero), quindi aggiungere i livelli insieme per ottenere la lunghezza del percorso interno. Questo algoritmo potrebbe non essere la più efficiente, dal momento che fa ricerche sul attraversamento per trovare il giusto bambino di ogni nodo, ma dovrebbe funzionare. Questo è il mio migliore ipotesi su come fare un algoritmo single-pass (assumendo che tutte le chiavi siano distinte):

int internal_path_length(key_iter& cur_node, key_iter end, int level, key max_key) {
  if (cur_node == end) return 0;
  key cur_key = *cur_node;
  if (cur_key > max_key) return 0;
  ++cur_node;
  int len1 = internal_path_length(cur_node, end, level + 1, cur_key);
  int len2 = internal_path_length(cur_node, end, level + 1, max_key);
  return len1 + len2 + level;
}

Iniziare con:

key_iter i = preorder.begin();
internal_path_length(i, preorder.end(), 0, mk);

dove mkè più grande il più grande possibile chiave nel vostro albero.

Risposto il 23/02/2011 a 06:48
fonte dall'utente

voti
0

Fin dalla sua un BST abbiamo implicitamente avere ordine simmetrico dell'albero (lista ordinata di elementi).

Siamo in grado di creare un albero unico da solo preordinare o postorder attraversamento Pre sarà [R, elenco degli elementi meno di R, lista di elementi maggiore di R] Messaggio sarà [elenco di elementi meno di R, lista di elementi maggiore di R, R]

pseudo codice sarà simile a questa.

findIPLPreOrder(poArray,startIndex,endIndex, height) {
     if(startIndex==endIndex){
          retrn height;
     }
     m=findIndexOfEndofLeftSubTree(poArray,start,end);
     return findIPLPreOrder(poArray,start+1,m,height + 1) + findIPLPreOrder(poArray,m+1,end,height + 1);     
}

findIndexOfEndofLeftSubTree(poArray,start,end){
  R=poArray[start]
  for(i=start+1;i<=end;i++){
     if(R < poArray[i]){
         return i-1;
       }
  }
}
Risposto il 23/02/2011 a 06:52
fonte dall'utente

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