Borrar elementos reemplazando por el menor de rbol
derecho, en la implementacin del TAD Diccionario con ABBs. //Propuesto: borrar reemplazando por menor de rbol derecho protected Nodo borrarD(Nodo r){ if(r.izq==null) return r.der; //Caso 1:solo arbol der. if(r.der==null) return r.izq; //Caso 2:solo arbol izq. //Caso 3: reemplazar por el menor de rbol derecho if( r.der.izq == null ){ r.id=r.der.id; r.info=r.der.info; r.der=r.der.der; }else{ Nodo q = r.der; while(q.izq.izq != null) q=q.izq; r.id=q.izq.id; r.info=q.izq.info; q.izq=q.izq.der; } return r; } 2. En relacin a los Arboles binarios, reescribir sus mtodos: hojas(raiz), altura(raiz) buscar(x,raiz), Inorden(raiz), Preorden(raiz) y PostOrden(raiz) a) sin recursin 3. En un rbol Heap invertido, donde el menor est en la raiz y cada nodo tiene valores mayores como sus hijos izquierdo y derecho. Implementar los mtodos extraerMenor(raiz) y agregar(x,raiz)
4.Para los siguientes problemas considere las declaraciones: class Nodo{ public Comparable valor; public Nodo izq, der; public Nodo(Comparable x, Nodo y, Nodo z){ valor=x; izq=y; der=z; } } Nodo raiz = null;
Ejemplo: raiz=new Nodo(C, new Nodo(B,null,null), new Nodo(D,null, new Nodo(F,null,null)) );
a) Escriba un mtodo recursivo que determine si un rbol es o no un rbol binario de bsqueda. Encabezamiento: boolean esABB(Nodo x) Ejemplo: esABB(raiz) = true
package Ejercicio4; public class ArbolBinarioBusqueda{ public static void main(String []args){ Nodo arbol1= null; Nodo arbol2 = new Nodo( "C",new Nodo("B",null,null), new Nodo("D",null, new Nodo("F",null,null)) ); Nodo arbol3= new Nodo("C",new Nodo("B",null,null), new Nodo("F",new Nodo("E",null,null),neNodo("F",null,null)));
System.out.println("Pruebar si es un ABB"); System.out.println(esABB(arbol1)); System.out.println(esABB(arbol2)); System.out.println(esABB(arbol3)); System.out.println("Deternimar su sucesor"); System.out.println(sucesor(arbol1) ); System.out.println(sucesor(arbol2)); System.out.println(sucesor(arbol3)); } public static boolean esABB(Nodo x){ if(x==null){ return true; } return ( x.izq==null ? true : (x.valor.compareTo(x.izq.valor)<=0 ?false : esABB(x.izq) ) )&&( x.der==null ? true : ( x.valor.compareTo(x.der.valor)>=0 ? false : esABB(x.der) ) ); } } b) Escriba un mtodo (no recursivo) que entregue el valor del sucesor de un nodo, es decir, el menor descendiente del subrbol derecho. Encabezamiento: String sucesor(Nodo x) Ejemplo: sucesor(raiz) = D
5.El TDA T tiene definidas las siguientes operaciones: Operacin Significado T t=new T() Crea un objeto de clase T sin informacin t.extraerMenor() Entrega (y elimina) el menor valor del objeto t.agregar(x) Agregar el valor x al objeto
a) use el TDA en un mtodo que ordene un arreglo: void ordenar(Comparable[]x)
package Ejercicio5; import java.util.Random; public class PruebaTadT { private static int M=10; private static int[] Comparable=new int[M]; public static void Ordena( int[] a ){ TADT t = new TADT(); for(int i=0; i<a.length; i++){ t.agregar(a[i]); } for(int j=0; j<a.length; j++) a[j]=t.extraerMenor(); } public static void main(String[] args){ int h; Random rd=new Random(); for( int i=0;i<M; i++){ h=rd.nextInt(100); Comparable[i]=h; } Ordena(Comparable); for( int i=0;i<M; i++){ System.out.println(Comparable[i]); } } }
b) implemente el TDA con un heap (AB que contiene el menor valor en su raz)
package Ejercicio5; public class TadHeap { private int MAX=10000; private int[] heap; private int n; public TadHeap(){ heap=new int[MAX]; n=0; } public void agregar(int x){ heap[n]=x; int m=(int)Math.floor(n/2); int j=n; while( heap[j]<heap[m] ){ int t=heap[j]; heap[j]=heap[m]; heap[m]=t; j=m; m=(int)Math.floor(j/2); if(j==m){ break; } } n++; } public int extraerMenor(){ int m=heap[0]; heap[0]=heap[--n]; int j=0; int k,t; while(2*j+1<n){ k=2*j+1; if(k+1<=n && heap[k+1]<heap[k]){ k=k+1; } if(heap[j]<heap[k]){ break; } t=heap[j]; heap[j]=heap[k]; heap[k]=t; j=k; } return m; } }
c) implemente el TDA con un arreglo
package Ejercicio5; public class TADT{ private int Max=1000; private int[] t; private int max; public TADT(){ t=new int[Max]; max=0; } public int extraerMenor(){ int temp=t[0]; int pos=0; for(int j=0;j<max;j++ ){ if( temp>t[j]){ temp=t[j]; pos=j; } } t[pos]=t[--max]; return temp; } public void agregar(int x){ if(max==Max){ return; } t[max++]=x; return; } }