Sto leggendo il cracking dell'intervista di codifica e ho una domanda sulla soluzione del seguente problema: Hai due alberi binari molto grandi: T1, con milioni di nodi, e T2, con centinaia di nodi. Creare un algoritmo per decidere se T2 è un sottoalbero di T1.Algoritmo per identificare se l'albero è sottostruttura dell'altro albero
La soluzione semplice che suggerisce è di creare una stringa che rappresenta gli attraversamenti in ordine e pre-order e verificare se T2s pre-ordine/in ordine di attraversamento è sottostringa di attraversamento pre-ordine/in ordine di T1.
Quello che mi chiedo è perché dobbiamo confrontare entrambi gli attraversamenti? E perché esattamente quei due attraversamenti, perché non per esempio in ordine e dopo l'ordine. E soprattutto non basterà una sola traversata? Dì solo attraversamenti in ordine o pre-ordine?
Prima chiariamo cosa intendi per "sottostruttura". Il significato teorico del grafico standard sarebbe "un sottografo formato eliminando zero o più vertici e bordi da un albero e che è esso stesso un albero" - ma esiste un altro significato comunemente usato, ovvero "elimina un bordo; 2 componenti connessi rimangono, entrambi i quali sono sottoalberi ". La prima definizione include alcuni alberi che quest'ultimo non ha. –
È interessante notare che l'algoritmo che hai fornito non funziona per alcune definizioni ragionevoli di "sottoalberi": come matematico, chiamerei 2 <-1-> 3 un sottoalbero di 4 <-2<-1-> 3-> 5. Ma il preordine del primo non è una sottostringa del secondo. – Joel
Quando si dice "Albero binario", possiamo supporre che siano "Albero di ricerca binaria" (cioè, un genitore è minore di uno dei suoi due figli)? Inoltre, i valori dei nodi sono univoci in ogni albero o no? –