martes, 21 de abril de 2009

Monticulo de máximos a lista en orden inverso (java)

El problema es el siguiente:


Realice un algoritmo que partiendo de un montículo de máximos, representado con un BinaryTree, devuelva una lista de los elementos de dicho montículo ordenados de mayor a menor. Los elementos del montículo son enteros.
NOTA: Se pueden utilizar estructuras auxiliares.


Para quién llame al montículo de máximos de otra forma, decir que es un árbol (binario en éste caso) en el que cada nodo es mayor o igual que sus hijos.

Dicho esto pondré la primera solucion en JAVA:


public LinkedList monticuloAlistaOrdenInverso2(BinaryTree b){
LinkedList sol = new LinkedList();
LinkedList laux = new LinkedList();
BinaryTree a;
int max, imax=0;
if(!b.isEmpty()){
laux.add(b);
a=b;
while(laux.size() > 0){
sol.add(a.getRoot());
laux.remove(imax);
if(a.left()!= null){
laux.add(a.left());}
if(a.right()!= null){
laux.add(a.right());}
max=Integer.MIN_VALUE;

for(int i=0; i < laux.size();i++){
if(max < laux.get(i).getRoot()){
max=laux.get(i).getRoot();
imax=i;
}
}
if(!laux.isEmpty()){
a=laux.get(imax);}
}
}
return sol;
}


Otra solución para montículos que no tengan valores repetidos es la siguiente:


public LinkedList monticuloAlistaOrdenInverso(BinaryTree b){
LinkedList l = new LinkedList();
TreeSet s = new TreeSet();
Object o;
Iterator i=b.iterator();
while(i.hasNext()){
s.add(i.next());
}
while(!s.isEmpty()){
o=s.last();
l.add(o);
s.remove(o);
}
return l;
}

No hay comentarios: