Magaly Giovanna Muoz Mndez 07/06/2014 REPORTE DE ARBOL BINARIO Reporte de rbol Binario Un rbol binario es una estructura de datos en la cual cada nodo siempre tiene un hijo izquierdo y un hijo derecho. No pueden tener ms de dos hijos, de ah el nombre binario. Si algn hijo tiene como referencia a null, es decir que no almacena ningn dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno. Un rbol Binario es un conjunto de finito de Elementos, de nombre Nodos de forma que: El rbol Binario es Vaci si no tiene ningn elemento en l. El rbol Binario contiene un Nodo Raz y los dos que parten de l, llamados Nodo Izquierdo y Nodo Derecho. Los rboles tienen 3 Recorridos Diferentes los cuales son: 1. Pre-Orden 2. In-Orden 3. Post-Orden El recorrido de rboles refiere al proceso de visitar de una manera sistemtica, exactamente una vez, cada nodo en una estructura de datos de rbol (examinando y/o actualizando los datos en los nodos). Pre-Orden: (raz, izquierdo, derecho). Para recorrer un rbol binario no vaco en Pre-Orden, hay que realizar las siguientes operaciones recursivamente en cada nodo, comenzando con el nodo de raz: Visite la raz Atraviese el sub-rbol izquierdo Atraviese el sub-rbol derecho
In-Orden: (izquierdo, raz, derecho). Para recorrer un rbol binario no vaco en In-Orden (simtrico), hay que realizar las siguientes operaciones recursivamente en cada nodo: Atraviese el sub-rbol izquierdo Visite la raz Atraviese el sub-rbol derecho
Post-Orden: (izquierdo, derecho, raz). Para recorrer un rbol binario no vaco en Post-Orden, hay que realizar las siguientes operaciones recursivamente en cada nodo: Atraviese el sub-rbol izquierdo Atraviese el sub-rbol derecho Visite la raz
En general, la diferencia entre Pre-Orden, In-Orden y Post-Orden es cundo se recorre la raz. En los tres, se recorre primero el sub-rbol izquierdo y luego el derecho. En Pre-Orden, la raz se recorre antes que los recorridos de los subrboles izquierdo y derecho En In-Orden, la raz se recorre entre los recorridos de los rboles izquierdo y derecho, y En Post-Orden, la raz se recorre despus de los recorridos por el subrbol izquierdo y el derecho A continuacin se expone un cdigo de un rbol binario, el cual se ha comentado sobre lo que se realiza en cada parte del cdigo package principalarbool;
//CODIGO ARBOL BINARIO CON RECORRIDOS EN PREORDEN, INORDEN y POSORDEN //programa para probar la clase arbol public class PrincipalArbool {
public static void main(String[] args) { PrincipalArbool ob=new PrincipalArbool(); //Creacion de objeto de la clase PrincipalArbool ob.ejer8(); //Aqui mandamos a llamar el metodo a la clase principal }
public void ejer8(){ // metodo en el cual se obtienen los datos que se agregagaran y se llaman los metodos que hacen los recorrimientos // ademas de que los imprime en pantalla. Arbol arbol = new Arbol(); //creacion del objeto Arbol, que proviene de la clase arbol, en la cual se insertaran los nodos y se haran //los diferentes recorridos del arbol, preorden inorden posorden. int valor; //declaracion de la variable valor, en la cual se almacenan los valores que corresponde a cada nodo
System.out.println( "Insertando los siguientes valores: ");//mensaje en pantalla que muestra los datos que se ingresaron al arbol
//insertando 7 numeros aleatorios del 0 al 20 en el arbol for (int i = 1; i<=7 ; i++) { valor = (int) (Math.random() * 20);//asigna los numeros al azar System.out.print(valor + " "); arbol.insertarNodo(valor);//hace referencia a un metodo de la clase arbol donde se insertan los nodos del arbol }
System.out.println("\n\nRecorrido preorden"); //Impresion en pantalla del recorrido en preorden arbol.recorridoPreorden();//hace referencia a un metodo de la clase arbol donde se imprimen los datos en preorden
System.out.println("\n\nRecorrido inorden");//Impresion en pantalla del recorrido en inorden arbol.recorridoInorden();//hace referencia a un metodo de la clase arbol donde se imprimen los datos en preorden
System.out.println("\n\nRecorrido posorden");//Impresion en pantalla del recorrido en posorden arbol.recorridoPosorden();//hace referencia a un metodo de la clase arbol donde se imprimen los datos en posorden } }
//arbol en java inorden, posorden, preorden */ //definicion de la clase NodoArbol, en esta clase se acomodan los datos en cada nodo del arbol class NodoArbol {
//miembros de acceso o declaracion de variables NodoArbol nodoizquierdo; int datos; NodoArbol nododerecho;
//Metodo constructor donde se iniciara un dato y se hara este dato o nodo, un nodo hoja; // un nodo hoja quiere decir que no tiene hijos o que termina el arbol public NodoArbol(int datosNodo) { datos = datosNodo;//se inicializa el dato que esta como nodo raiz, que seran en su momento todos los datos que se menteran al arbol //en el comiezo de la isercion de datos el primer numero sera en nodo raiz nodoizquierdo = nododerecho = null; //el nodo no tiene hijos, es decir que el arbol esta vacio }
//buscar punto de insercion e insertar nodo nuevo public synchronized void insertar(int valorInsertar) { //insertar en subarbol izquierdo if (valorInsertar < datos){//si en numero que se insertara es menor que el nodo raiz, se prosigue //inserta nuevo nodoarbol if (nodoizquierdo == null)//si el nodo izquierdo donde se quiere poner el dato esta vacio, entonces lo inserta nodoizquierdo = new NodoArbol(valorInsertar); else //sino continua recorriendo subarbol izquierdo e inserta nodoizquierdo.insertar(valorInsertar); }
//insertar nodo derecho else if(valorInsertar > datos){//si al dato que se insertara es mayor al nodo raiz, se prosigue
//insertar nuevo nodoarbol if (nododerecho == null)//si el nodo derecho donde se quiere poner el dato esta vacio, entonces lo inserta nododerecho = new NodoArbol(valorInsertar); else //sino continua recorriendo subarbol derecho nododerecho.insertar(valorInsertar); } //NOTA: se tiene que hacer este procedimiento por cada insercion en cada nivel del arbol, es decir, comparar siempre //si el numero a insertar es mayor o menor al nodo raiz del nivel. } //fin del metodo insertar
} //fin clase nodoarbol
//---------- CLASE ARBOL------------------ class Arbol{//en esta clase se almacenan los metodos de los recorridos private NodoArbol raiz; //de declara la variable raiz como tipo nodo arbol //esto se hace ya que se construira un nuevo arbol y se necesita eu la variabla raiz haga lo que realiza el //metodo insertar de la clase NodoArbol
//se empieza a contruir un arbol vacio public Arbol() { raiz = null;//es decir que el arbol esta vacio }
//insertar un nuevo nodo en el arbol de busqueda binaria public synchronized void insertarNodo(int valorInsertar)//metodo que empieza la inserccion de los nodos //este metodo es synchronized, ya que se llama cuando se necesita y solo se puede ingresar si se cumplen las condiones //es decir, como una llave de entrada y un cuello de botella, ya que solo se puede ungresar de uno en uno { if(raiz == null)//si la raiz es nula, es decir esta vacio, realiza lo siguiente raiz = new NodoArbol(valorInsertar); //se crea el nodo raiz que sera el primer elemento del arbol
else raiz.insertar(valorInsertar); // se llama al metodo insertar, en la cual se realizara lo que se explica en el metodo }//NOTA: se hara esto haste que se inserten todos los datos en el arbol
//--------------- EMPESAR EL RECORRIDO EN PREORDEN----------------- ------ public synchronized void recorridoPreorden()//metodo que llama el metodo donde se realiza el preorden de manera recursiva { ayudantePreorden(raiz);//llamada del metodo que recive como parametro el valor de la raiz, es decir el nodo }
//metodo recursivo para recorrido en preorden, un Recorrido en preorden toma el nodo raiz como principal, luego el nodo izquierdo // y por ultimo el nodo derecho, as sucesivamente, es un metodo recursivo ya que se regresa para comparar cada uno de los niveles y nodos private void ayudantePreorden(NodoArbol nodo)//este metodo recibe como parametro el nodo de tipo NodoArbol { if (nodo == null)//si el nodo es nulo retorna las impreciones de pantalla return; System.out.print(nodo.datos + " "); // mostrar datos del nodo ayudantePreorden(nodo.nodoizquierdo); //recorre subarbol izquierdo ayudantePreorden(nodo.nododerecho); //recorre subarbol derecho }
//metodo recursivo para recorrido en inorden, un Recorrido en inorde toma el nodo izquierdo como principal, luego el nodo raiz // y por ultimo el nodo derecho, as sucesivamente, es un metodo recursivo ya que se regresa para comparar cada uno de los niveles y nodos
private void ayudanteInorden(NodoArbol nodo) { if (nodo == null) return;
ayudanteInorden(nodo.nodoizquierdo);//recorre subarbol izquierdo System.out.print(nodo.datos + " ");// mostrar datos del nodo ayudanteInorden(nodo.nododerecho);//recorre subarbol derecho }
//metodo recursivo para recorrido en posorden, un Recorrido en posorden toma el nodo izquierdo como principal, luego el nodo derecho // y por ultimo el nodo raiz, as sucesivamente, es un metodo recursivo ya que se regresa para comparar cada uno de los niveles y nodos
private void ayudantePosorden(NodoArbol nodo) { if (nodo == null) return;
ayudantePosorden(nodo.nodoizquierdo);//recorre subarbol izquierdo ayudantePosorden(nodo.nododerecho);//recorre subarbol derecho System.out.print(nodo.datos + " ");// mostrar datos del nodo }