You are on page 1of 15

Problema 1: A continuacin desarrollamos una clase para la administracin de un rbol binario ordenado.

public class ArbolBinarioOrdenado { class Nodo { int info; Nodo izq, der; } Nodo raiz; public ArbolBinarioOrdenado() { raiz=null; } public void insertar (int info) { Nodo nuevo; nuevo = new Nodo (); nuevo.info = info; nuevo.izq = null; nuevo.der = null; if (raiz == null) raiz = nuevo; else { Nodo anterior = null, reco; reco = raiz; while (reco != null) { anterior = reco; if (info < reco.info) reco = reco.izq; else reco = reco.der; } if (info < anterior.info) anterior.izq = nuevo;

else anterior.der = nuevo; } } private void imprimirPre (Nodo reco) { if (reco != null) { System.out.print(reco.info + " "); imprimirPre (reco.izq); imprimirPre (reco.der); } } public void imprimirPre () { imprimirPre (raiz); System.out.println(); } private void imprimirEntre (Nodo reco) { if (reco != null) { imprimirEntre (reco.izq); System.out.print(reco.info + " "); imprimirEntre (reco.der); } } public void imprimirEntre () { imprimirEntre (raiz); System.out.println(); }

private void imprimirPost (Nodo reco) { if (reco != null) { imprimirPost (reco.izq); imprimirPost (reco.der); System.out.print(reco.info + " "); } } public void imprimirPost () { imprimirPost (raiz); System.out.println(); } public static void main (String [] ar) { ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado (); abo.insertar (100); abo.insertar (50); abo.insertar (25); abo.insertar (75); abo.insertar (150); System.out.println ("Impresion preorden: "); abo.imprimirPre (); System.out.println ("Impresion entreorden: "); abo.imprimirEntre (); System.out.println ("Impresion postorden: "); abo.imprimirPost (); } }

Problema 2: Confeccionar una clase que permita insertar un entero en un rbol binario ordenado verificando que no se encuentre previamente dicho nmero. Desarrollar los siguientes mtodos: 1. 2. 3. 4. 5. 6. 7. Retornar la cantidad de nodos del rbol. Retornar la cantidad de nodos hoja del rbol. Imprimir en entre orden. Imprimir en entre orden junto al nivel donde se encuentra dicho nodo. Retornar la altura del rbol. Imprimir el mayor valor del rbol. Borrar el nodo menor del rbol.

public class ArbolBinarioOrdenado { class Nodo { int info; Nodo izq, der; } Nodo raiz; int cant; int altura; public ArbolBinarioOrdenado() { raiz=null; } public void insertar (int info) { if (!existe(info)) { Nodo nuevo; nuevo = new Nodo (); nuevo.info = info; nuevo.izq = null; nuevo.der = null; if (raiz == null) raiz = nuevo; else {

Nodo anterior = null, reco; reco = raiz; while (reco != null) { anterior = reco; if (info < reco.info) reco = reco.izq; else reco = reco.der; } if (info < anterior.info) anterior.izq = nuevo; else anterior.der = nuevo; } } } public boolean existe(int info) { Nodo reco=raiz; while (reco!=null) { if (info==reco.info) return true; else if (info>reco.info) reco=reco.der; else reco=reco.izq; } return false; } private void imprimirEntre (Nodo reco) { if (reco != null) { imprimirEntre (reco.izq); System.out.print(reco.info + " "); imprimirEntre (reco.der); } }

public void imprimirEntre () { imprimirEntre (raiz); System.out.println(); } private void cantidad(Nodo reco) { if (reco!=null) { cant++; cantidad(reco.izq); cantidad(reco.der); } } public int cantidad() { cant=0; cantidad(raiz); return cant; } private void cantidadNodosHoja(Nodo reco) { if (reco!=null) { if (reco.izq==null && reco.der==null) cant++; cantidadNodosHoja(reco.izq); cantidadNodosHoja(reco.der); } } public int cantidadNodosHoja() { cant=0; cantidadNodosHoja(raiz); return cant; }

private void imprimirEntreConNivel (Nodo reco,int nivel) { if (reco != null) { imprimirEntreConNivel (reco.izq,nivel+1); System.out.print(reco.info + " ("+nivel+") - "); imprimirEntreConNivel (reco.der,nivel+1); } } public void imprimirEntreConNivel () { imprimirEntreConNivel (raiz,1); System.out.println(); } private void retornarAltura (Nodo reco,int nivel) if (reco != null) { retornarAltura (reco.izq,nivel+1); if (nivel>altura) altura=nivel; retornarAltura (reco.der,nivel+1); } } public int retornarAltura () { altura=0; retornarAltura (raiz,1); return altura; } public void mayorValorl() { if (raiz!=null) { Nodo reco=raiz; while (reco.der!=null) reco=reco.der; System.out.println("Mayor valor del rbol:"+reco.info); } } {

public void borrarMenor() { if (raiz!=null) { if (raiz.izq==null) raiz=raiz.der; else { Nodo atras=raiz; Nodo reco=raiz.izq; while (reco.izq!=null) { atras=reco; reco=reco.izq; } atras.izq=reco.der; } } } public static void main (String [] ar) { ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado (); abo.insertar (100); abo.insertar (50); abo.insertar (25); abo.insertar (75); abo.insertar (150); System.out.println ("Impresion entreorden: "); abo.imprimirEntre (); System.out.println ("Cantidad de nodos del rbol:"+abo.cantidad()); System.out.println ("Cantidad de nodos hoja:"+abo.cantidadNodosHoja()); System.out.println ("Impresion en entre orden junto al nivel del nodo."); abo.imprimirEntreConNivel(); System.out.print ("Artura del arbol:"); System.out.println(abo.retornarAltura()); abo.mayorValorl(); abo.borrarMenor(); System.out.println("Luego de borrar el menor:"); abo.imprimirEntre (); } }

Aplicaciones con arboles binarios: Trabalenguas package trabalenguas; public class BTree { private BTree izquierda= null; private BTree derecha= null; private Object elemento; public static int LADO_IZDO= 1; public static int LADO_DRCHO= 2; public BTree(Object elemento) { this.elemento = elemento ; } public Object getElement() { return elemento; } public BTree getIzquierda() { return izquierda; } public BTree getDerecha() { return derecha; } public void insertar(BTree tree, int lado) throws BTreeException { if (lado==LADO_IZDO) { if (izquierda==null) izquierda= tree; else throw new BTreeException("Ya hay un rbol enlazado"); } else if (lado==LADO_DRCHO) { if (derecha==null) derecha= tree; else throw new BTreeException("Ya hay un rbol enlazado"); } else throw new BTreeException("Lado incorrecto"); }

public BTree extraer(int lado) throws BTreeException { BTree subarbol; if (lado==LADO_IZDO) { subarbol= izquierda; izquierda= null; } else if (lado==LADO_DRCHO) { subarbol= derecha; derecha= null; } else throw new BTreeException("Lado incorrecto"); return subarbol; } public void imprimePreOrden() { System.out.println(elemento); if (izquierda!=null) izquierda.imprimePreOrden(); if (derecha!=null) derecha.imprimePreOrden(); } public void imprimePostOrden() { if (izquierda!=null) izquierda.imprimePostOrden(); if (derecha!=null) derecha.imprimePostOrden(); System.out.println(elemento); } public void imprimeEnOrden() { if (izquierda!=null) izquierda.imprimeEnOrden(); System.out.println(elemento); if (derecha!=null) derecha.imprimeEnOrden(); } }

package trabalenguas; public class BTreeException extends Exception { public BTreeException (String mensaje) { super(mensaje); } }

package trabalenguas; public class Trabalenguas { public static void main(String args[]) { BTree trabalenguas, subarbol, temporal; try { trabalenguas= new BTree("Tres"); subarbol= new BTree("tristes"); trabalenguas.insertar(subarbol, BTree.LADO_IZDO); temporal= new BTree("tigres"); trabalenguas.insertar(temporal, BTree.LADO_DRCHO); temporal= new BTree("coman"); subarbol.insertar(temporal, BTree.LADO_IZDO); temporal= new BTree("trigo"); subarbol.insertar(temporal, BTree.LADO_DRCHO); } catch (BTreeException ex) { System.out.println(ex.getMessage()); return; } trabalenguas.imprimePreOrden(); System.out.println("------------------"); trabalenguas.imprimeEnOrden(); System.out.println("------------------"); trabalenguas.imprimePostOrden();

System.out.println("------------------"); System.out.println("------------------"); try { subarbol= trabalenguas.extraer(BTree.LADO_IZDO); } catch (BTreeException ex) { System.out.println(ex.getMessage()); return; } trabalenguas.imprimePreOrden(); } }

ACTIVIDAD COMPLEMENTARIA: 1. Se tiene almacenada una frase en un archivo de texto. Disee un algoritmo que almacene las palabras de la frase en un rbol binario de bsqueda. Las palabras del rbol no se podrn repetir y en cada nodo se almacenar la palabra y el nmero de veces que aparece en la frase. El algoritmo deber mostrar por pantalla las palabras ordenadas por la frecuencia de aparicin. 2. Utilizacin de las estructuras definidas: a continuacin se muestra el uso de la clase Tree de java en la creacin y manipulacin de un rbol binario, se solicita analizar el cdigo y especificar las acciones realizadas en el, adems implementar el mtodo main y un objeto de la clase Tree para probar la funcionabilidad de este cdigo. import java.util.ArrayList; import java.util.Collection; import java.util.HashMap; public class Tree<T> { private T head; private ArrayList<Tree<T>> leafs = new ArrayList<Tree<T>>(); private Tree<T> parent = null;

private HashMap<T, Tree<T>> locate = new HashMap<T, Tree<T>>(); public Tree(T head) { this.head = head; locate.put(head, this); } public void addLeaf(T root, T leaf) { if (locate.containsKey(root)) { locate.get(root).addLeaf(leaf); } else { addLeaf(root).addLeaf(leaf); } } public Tree<T> addLeaf(T leaf) { Tree<T> t = new Tree<T>(leaf); leafs.add(t); t.parent = this; t.locate = this.locate; locate.put(leaf, t); return t; } public Tree<T> setAsParent(T parentRoot) { Tree<T> t = new Tree<T>(parentRoot); t.leafs.add(this); this.parent = t; t.locate = this.locate; t.locate.put(head, this); t.locate.put(parentRoot, t); return t; } public T getHead() { return head; } public Tree<T> getTree(T element) { return locate.get(element);

} public Tree<T> getParent() { return parent; } public Collection<T> getSuccessors(T root) { Collection<T> successors = new ArrayList<T>(); Tree<T> tree = getTree(root); if (null != tree) { for (Tree<T> leaf : tree.leafs) { successors.add(leaf.head); } } return successors; } public Collection<Tree<T>> getSubTrees() { return leafs; } public static <T> Collection<T> getSuccessors(T of, Collection<Tree<T>> in) { for (Tree<T> tree : in) { if (tree.locate.containsKey(of)) { return tree.getSuccessors(of); } } return new ArrayList<T>(); } @Override public String toString() { return printTree(0); } private static final int indent = 2; private String printTree(int increment) { String s = ""; String inc = ""; for (int i = 0; i < increment; ++i) {

inc = inc + " "; } s = inc + head; for (Tree<T> child : leafs) { s += "\n" + child.printTree(increment + indent); } return s; } }

You might also like