[Java][Alberi Binari] Perplessità
A una settimana all'esame, mi sto scontrando con le ultimissime resistenze opposte dalle strutture dati. In questo caso fatico a trovare un modo semplice per implementare quanto richiesto dall'esercizio inserito nello spoiler. Anticipo che si tratta di un esercizio un po'particolare...Grazie a chi vorrà e/o saprà aiutarmi.
Risposte
Anche se fatichi a trovare un modo semplice, parti dal modo che hai in mente: proponi e vediamo.

Un piccolo suggerimento nel caso non ti venissero idee:
public class Eserc4 { public static boolean exists (NodoBin rad, String s) { if(rad==null) return false; if(rad.info.equals(s)&&(rad.sin!=null||rad.des!=null)) return true; else return exists(rad.sin,s)||exists(rad.des,s); } }
Questo è il codice dell'esercizio da me stilato. Va sottolineato che questa non è la soluzione, infatti con una classe di prova appositamente scritta ottengo true a sproposito.
Ho appena notato di aver letto male il problema. Pensavo ad un problema leggermente diverso: stabilire cioè se esiste un sottoalbero contenente la stringa e che ha un numero di nodi pari (i discendenti della radice sono dispari). Ma il problema dato è molto più semplice. Ti invito comunque una volta risolto questo a provare questo nuovo problema.
Il metodo più semplice è forse quello di dividere il tuo problema risolvendo ognuna delle condizioni separatamente. Per un qualche nodo, exists è vero se lo è per un suo qualche sottoalbero oppure se contiene la stringa cercata e ha un numero di figli dispari. È quasi tutto corretto tranne il test per stabilire se il numero di figli è dispari. Dovrebbe essere:
infatti devi verificare che uno dei due sia nullo e l'altro no.
Il metodo più semplice è forse quello di dividere il tuo problema risolvendo ognuna delle condizioni separatamente. Per un qualche nodo, exists è vero se lo è per un suo qualche sottoalbero oppure se contiene la stringa cercata e ha un numero di figli dispari. È quasi tutto corretto tranne il test per stabilire se il numero di figli è dispari. Dovrebbe essere:
((rad.sin!=null && rad.des==null)||(rad.sin==null && rad.des!=null))
infatti devi verificare che uno dei due sia nullo e l'altro no.
O meglio ancora potresti usare:
dove ^ è l'operatore XOR di or esclusivo che è quello che desideri in questo caso. Solo una delle due condizioni deve essere verificata. Puoi anche usare != null.
((rad.sin == null) ^ (rad.des == null))
dove ^ è l'operatore XOR di or esclusivo che è quello che desideri in questo caso. Solo una delle due condizioni deve essere verificata. Puoi anche usare != null.
Ero arrivato anche io alla soluzione
In effetti inizialmente il problema l'avevo interpretato proprio come te. In quel caso non saprei bene come procedere. Ho pensato anche io di creare un metodo che conta i nodi e verifica se sono in numero pari o dispari...però credo che la ricerca dell'oggetto non possa procedere ricorsivamente.
Deve infatti essere verificato contemporaneamente che un sottoalbero abbia nodi in numero dispari (esclusa la radice) e contenga in uno dei suoi nodi la stringa cercata. Perciò credo sia necessario visitare l'albero intero prima di poter giudicare, anche se la stringa viene trovata subito. Ad esempio se si trova nel figlio sinistro della radice, si può decidere di contare i nodi del solo sottoalbero sinistro, e restituire true se e solo se essi sono in numero pari, false altrimenti. dico male?
((rad.sin!=null && rad.des==null)||(rad.sin==null && rad.des!=null))
In effetti inizialmente il problema l'avevo interpretato proprio come te. In quel caso non saprei bene come procedere. Ho pensato anche io di creare un metodo che conta i nodi e verifica se sono in numero pari o dispari...però credo che la ricerca dell'oggetto non possa procedere ricorsivamente.
Deve infatti essere verificato contemporaneamente che un sottoalbero abbia nodi in numero dispari (esclusa la radice) e contenga in uno dei suoi nodi la stringa cercata. Perciò credo sia necessario visitare l'albero intero prima di poter giudicare, anche se la stringa viene trovata subito. Ad esempio se si trova nel figlio sinistro della radice, si può decidere di contare i nodi del solo sottoalbero sinistro, e restituire true se e solo se essi sono in numero pari, false altrimenti. dico male?