marcoeanna
27-06-2017, 11:38
Salve a tutti, mi sono iscritto da poco su questo forum, spero di trovarmi bene :) Apro questa discussione in quanto sto preparando l'esame di Strutture Dati ma ho delle difficoltà sull'argomento degli alberi binari e quindi anche con la ricorsione.
Sto provando a fare l'esercizio che chiede di scrivere una funzione che restituisce true o false se gli alberi binari in questione sono uguali.
Ho scritto il codice ma non funziona bene, in particolare noto che se vado a cambiare i valori dei figli sinistri non mi ritorna false, mentre cambiando sui figli destri funziona. Dove sbaglio?
package alberoBinario;
import java.util.logging.Logger;
import binaryTree.BinaryTree;
import binaryTree.LinkedBinaryTree;
import position.Position;
public class Ex4 {
private static Logger logger = Logger.getLogger("global");
public static void main(String[] args){
LinkedBinaryTree<Integer> alberoT = new LinkedBinaryTree<>();
Position<Integer> radiceT = alberoT.addRoot(0);
Position<Integer> t1 = alberoT.insertLeft(radiceT, 1);
Position<Integer> t2 = alberoT.insertRight(radiceT, 2);
Position<Integer> t3 = alberoT.insertLeft(t2, 3);
Position<Integer> t4 = alberoT.insertRight(t2, 4);
LinkedBinaryTree<Integer> alberoS = new LinkedBinaryTree<>();
Position<Integer> radiceS = alberoS.addRoot(0);
Position<Integer> s1 = alberoS.insertLeft(radiceS, 1);
Position<Integer> s2 = alberoS.insertRight(radiceS, 2);
Position<Integer> s3 = alberoS.insertLeft(s2, 3);
Position<Integer> s4 = alberoS.insertRight(s2, 4);
System.out.println("I due alberi binari sono uguali? "+uguali(alberoT, alberoS));
}
public static <E> boolean uguali(BinaryTree<E> T, BinaryTree<E> S){
if(T.isEmpty() && !S.isEmpty())
return false;
if(S.isEmpty() && !T.isEmpty())
return false;
if(T.isEmpty() && S.isEmpty())
return true;
return uguali(T, T.root(), S, S.root(), false);
}
public static <E> boolean uguali(BinaryTree<E> T, Position<E> vT, BinaryTree<E> S, Position<E> vS, boolean result){
if(vT.element().equals(vS.element()))
result = true;
else
return false;
if( (T.hasLeft(vT) && !S.hasLeft(vS)) || (!T.hasLeft(vT) && S.hasLeft(vS)) ){
result = false;
return result;
}
if(T.hasRight(vT) && !S.hasRight(vS) || (!T.hasRight(vT) && S.hasRight(vS)) ){
result = false;
return result;
}
if(T.hasLeft(vT) && S.hasLeft(vS))
result = uguali(T, T.left(vT), S, S.left(vS), result);
if(T.hasRight(vT) && S.hasRight(vS))
result = uguali(T, T.right(vT), S, S.right(vS), result);
return result;
}
}
Spero di leggere qualche vostra risposta grazie in anticipo :)
Sto provando a fare l'esercizio che chiede di scrivere una funzione che restituisce true o false se gli alberi binari in questione sono uguali.
Ho scritto il codice ma non funziona bene, in particolare noto che se vado a cambiare i valori dei figli sinistri non mi ritorna false, mentre cambiando sui figli destri funziona. Dove sbaglio?
package alberoBinario;
import java.util.logging.Logger;
import binaryTree.BinaryTree;
import binaryTree.LinkedBinaryTree;
import position.Position;
public class Ex4 {
private static Logger logger = Logger.getLogger("global");
public static void main(String[] args){
LinkedBinaryTree<Integer> alberoT = new LinkedBinaryTree<>();
Position<Integer> radiceT = alberoT.addRoot(0);
Position<Integer> t1 = alberoT.insertLeft(radiceT, 1);
Position<Integer> t2 = alberoT.insertRight(radiceT, 2);
Position<Integer> t3 = alberoT.insertLeft(t2, 3);
Position<Integer> t4 = alberoT.insertRight(t2, 4);
LinkedBinaryTree<Integer> alberoS = new LinkedBinaryTree<>();
Position<Integer> radiceS = alberoS.addRoot(0);
Position<Integer> s1 = alberoS.insertLeft(radiceS, 1);
Position<Integer> s2 = alberoS.insertRight(radiceS, 2);
Position<Integer> s3 = alberoS.insertLeft(s2, 3);
Position<Integer> s4 = alberoS.insertRight(s2, 4);
System.out.println("I due alberi binari sono uguali? "+uguali(alberoT, alberoS));
}
public static <E> boolean uguali(BinaryTree<E> T, BinaryTree<E> S){
if(T.isEmpty() && !S.isEmpty())
return false;
if(S.isEmpty() && !T.isEmpty())
return false;
if(T.isEmpty() && S.isEmpty())
return true;
return uguali(T, T.root(), S, S.root(), false);
}
public static <E> boolean uguali(BinaryTree<E> T, Position<E> vT, BinaryTree<E> S, Position<E> vS, boolean result){
if(vT.element().equals(vS.element()))
result = true;
else
return false;
if( (T.hasLeft(vT) && !S.hasLeft(vS)) || (!T.hasLeft(vT) && S.hasLeft(vS)) ){
result = false;
return result;
}
if(T.hasRight(vT) && !S.hasRight(vS) || (!T.hasRight(vT) && S.hasRight(vS)) ){
result = false;
return result;
}
if(T.hasLeft(vT) && S.hasLeft(vS))
result = uguali(T, T.left(vT), S, S.left(vS), result);
if(T.hasRight(vT) && S.hasRight(vS))
result = uguali(T, T.right(vT), S, S.right(vS), result);
return result;
}
}
Spero di leggere qualche vostra risposta grazie in anticipo :)