Utilità di attraversamento pre e post ordine di alberi binari


13

Questo può essere molto ingenuo, ma mi chiedevo, è il contesto di alberi binari (semplici, ordinati ed equilibrati), di tutti i tipi di attraversamento:

  • profondità pre-ordine
  • primo in ordine di profondità
  • profondità del primo ordine
  • ampiezza

qual è l'utilità effettiva di pre e post-ordine? Voglio dire, c'è qualche tipo e / o configurazione dell'albero binario in cui l'attraversamento pre e / o post-ordine darebbe un (qualche) vantaggio (s) rispetto agli altri due?

AFAICS, ci sono alcuni tipi e configurazioni di alberi binari per i quali in-order e breadth-first potrebbero dare un certo vantaggio:

  • per un albero binario bilanciato qualsiasi attraversamento in profondità utilizza meno spazio di memoria rispetto all'ampiezza prima (ad es. per albero binario bilanciato di 6 o 7 nodi, l'altezza è 2, quindi qualsiasi attraversamento in profondità dovrà memorizzare un massimo di 2 nodi in qualsiasi momento, mentre l'ultimo livello ha 3 o 4 nodi, quindi l'ampiezza del primo attraversamento avrebbe bisogno di memorizzare fino a 3 o 4 nodi ad un certo punto). In questo caso, l'utilizzo di attraversamento in ordine utilizza la minima quantità di memoria e visita i nodi nel loro ordine naturale.

  • per un albero binario non bilanciato, se si avvicina allo scenario di inserzione nel caso peggiore, attraversandolo per ampiezza utilizzerebbe meno memoria rispetto a qualsiasi traversata in profondità. Quindi, in questo caso, l'ampiezza offre innanzitutto un vantaggio. Il traversal in ordine ha ancora il vantaggio di visitare i valori nel loro ordine naturale.

Tuttavia, non riesco a pensare a una situazione in cui pre e post-traversal darebbero un vantaggio rispetto agli altri due.

Risposte:


13

Devi fare varie cose con gli alberi, come tradurre tra la struttura dei dati e alcune rappresentazioni seriali, come su un file o in una lingua.

Quindi, ad esempio, supponiamo di avere un albero di analisi come questo:

    *
   / \
  +   \
 / \   \
A   B   C

È possibile serializzarlo come * + A B Cpercorrendolo nell'ordine prefisso o come A B + C *percorrendolo nell'ordine postfisso. Se lavori con i processori di linguaggio, queste cose devono essere di seconda natura.


Ottimo esempio! E nota come produrrebbe l'attraversamento in ordine A + B * C, il che è molto più facile da capire per gli utenti normali rispetto a entrambi i prefissi dell'ordine postfisso.
Kilian Foth,

3
@KilianFoth tranne che non è quello che dice l'albero - dice (A + B) * C, almeno ai miei occhi. Anche se le mie dita dell'HP-28 gradiscono la versione AB + C *. :-)
martedì

@Kilian: sdg ha ragione. Con inorder, devi preoccuparti della precedenza, a meno che tu non metta le parentesi attorno a tutto.
Mike Dunlavey,

13

L' articolo di Wikipedia ha una bella descrizione concisa di quando si desidera utilizzare i diversi tipi di ricerca approfondita:

  • L'attraversamento del pre-ordine durante la duplicazione di nodi e valori può creare un duplicato completo di un albero binario. Può anche essere usato per creare un'espressione di prefisso (notazione polacca) dagli alberi delle espressioni: attraversare l'albero delle espressioni in modo pre-ordinato.
  • Il traversal nell'ordine è molto comunemente usato sugli alberi di ricerca binari perché restituisce i valori dell'insieme sottostante in ordine, secondo il comparatore che ha impostato l'albero di ricerca binario (da cui il nome).
  • L'attraversamento dell'ordine post durante l'eliminazione o la liberazione di nodi e valori può eliminare o liberare un intero albero binario. Può anche generare una rappresentazione postfix di un albero binario.

Si riduce alle esigenze logistiche di un algoritmo. Ad esempio, se non si utilizza l'attraversamento post ordine durante l'eliminazione, si perdono i riferimenti necessari per l'eliminazione degli alberi secondari.


Wikipedia dal 10 novembre 2019 è cambiata e la prima descrizione appartiene anche a Post-Order, il che è confuso. Questo è il motivo per cui sono finito qui, alla ricerca di un'altra fonte di informazioni.
whoan

5

Il punto di avere algoritmi diversi per gestire gli alberi binari non è fare cose con gli alberi. A questo livello astratto, un ordine è in gran parte buono come un altro, poiché dalla procedura si ottengono solo simboli astratti.

Ma gli alberi sono in genere usati per rappresentare cose interessanti e questo può fare una grande differenza nel risultato. Ad esempio, se i nodi rappresentano gli stati di ricerca in una ricerca completa attraverso un grande dominio (forse anche un dominio infinito), discendente prima vs. elaborazione prima determina non solo in quale ordine vengono trovati i risultati, ma può anche determinare se trova qualsiasi soluzione . Il punto è più facile da vedere con infiniti domini: se scendi incautamente, potresti trascurare una soluzione che si trova abbastanza in alto nell'albero, semplicemente perché hai preso una svolta sbagliata. Ma in pratica, poiché anche la memoria e i dischi sono limitati, ciò vale anche per domini che sono semplicemente molto grandi piuttosto che veramente infiniti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.