lunes, 22 de abril de 2013

Tarea 3: Algoritmos de Búsqueda en Java - Rodrigo Cofré.-

Arboles Binarios

Se define un árbol binario como un conjunto finito de elementos (nodos) que bien esta vacío o esta formado por una raíz con dos arboles binarios disjuntos, es decir, dos descendientes directos llamados subarbol izquierdo y subarbol derecho.

Los árboles binarios (también llamados de grado 2 )tienen una especial importancia.

Las aplicaciones de los arboles binarios son muy variadas ya que se les puede utilizar para representar una estructura en la cual es posible tomar decisiones con dos opciones en distintos puntos.

Arbol binario de búsqueda.

Los árboles binarios se utilizan frecuentemente para representar conjuntos de datos cuyos elementos se identifican por una clave única. Si el árbol está organizado de tal manera que la clave de cada nodo es mayor que todas las claves su subarbol izquierdo, y menor que todas las claves del subarbol derecho se dice que este árbol es un árbol binario de búsqueda.


Ejemplo:

Operaciones básicas

Una tarea muy común a realizar con un árbol es ejecutar una determinada operación con cada uno de los elementos del árbol. Esta operación se considera entonces como un parámetro de una tarea más general que es la visita de todos los nodos o, como se denomina usualmente, del recorrido del árbol.

Si se considera la tarea como un proceso secuencial, entonces los nodos individuales se visitan en un orden específico, y pueden considerarse como organizados según una estructura lineal. De hecho, se simplifica considerablemente la descripción de muchos algoritmos si puede hablarse del proceso del siguiente elemento en el árbol, según un cierto orden subyacente.

Hay dos formas básicas de recorrer un árbol: El recorrido en amplitud y el recorrido en profundidad.

Recorrido de un Arbol Binario

Recorrido en amplitud

Es aquel recorrido que recorre el árbol por niveles, en el último ejemplo sería:

12 - 8,17 - 5,9,15

Recorrido en profundidad

Recorre el árbol por subárboles.

Hay tres Preorden, orden central y postorden.

Hay tres formas: en inorden, preorden y postorden. Cada una de ellas tiene una secuencia distinta para analizar el árbol como se puede ver a continuación:

1. Inorden

Recorrer el subarbol izquierdo en inorden.

Examinar la raíz.

Recorrer el subarbol derecho en inorden.

Preorden

Examinar la raíz.

Recorrer el subarbol izquierdo en preorden.

recorrer el subarbol derecho en preorden.

Postorden

Recorrer el subarbol izquierdo en postorden.

Recorrer el subarbol derecho en postorden.

Examinar la raíz.

A continuación se muestra un ejemplo de los diferentes recorridos en un árbol binario.

Inorden: GDBHEIACJKF

Preorden: ABDGEHICFJK

Postorden: GDHIEBKJFCA

Clasificación de Arboles Binarios

Existen cuatro tipos de árbol binario:.

Arbol Binario Distinto.

Arbol Binario Similares.

Arbol Binario Equivalentes.

Arbol Binario Completos.

A continuación se hará una breve descripción de los diferentes tipos de árbol binario así como un ejemplo de cada uno de ellos.

Arbol Binario Distinto

Se dice que dos árboles binarios son distintos cuando sus estructuras son diferentes.

Ejemplo:

Arbol Binario Similar

Dos arboles binarios son similares cuando sus estructuras son idénticas, pero la información que contienen sus nodos es diferente.

Ejemplo:

Arbol Binario Equivalente

Son aquellos arboles que son similares y que además los nodos contienen la misma información. Ejemplo:

Arbol Binario Completo

Son aquellos arboles en los que todos sus nodos excepto los del ultimo nivel, tiene dos hijos; el subarbol izquierdo y el subarbol derecho.

Terminología

La terminología que por lo regular se utiliza para el manejo de arboles es la siguiente:

Hijo: X es hijo de Y, sí y solo sí el nodo X es apuntado por Y. También se dice que X es descendiente directo de Y.

Padre: X es padre de Y sí y solo sí el nodo X apunta a Y. También se dice que X es antecesor de Y.

Hermano: Dos nodos serán hermanos si son descendientes directos de un mismo nodo.

Hoja: Se le llama hoja o terminal a aquellos nodos que no tienen ramificaciones (hijos).

Nodo anterior: Es un nodo que no es raíz ni terminal.

Grado: Es el número de descendientes directos de un determinado nodo.

Grado de un árbol: Es el máximo grado de todos los nodos del árbol.

Nivel: Es el número de arcos que deben ser recorridos para llegar a un determinado nodo. Por definición la raíz tiene nivel 1.

Altura: Es el máximo número de niveles de todos los nodos del árbol.

Peso: Es el número de nodos del árbol sin contar la raíz.

Longitud de camino: Es el número de arcos que deben ser recorridos para llegar desde la raíz al nodo X. Por definición la raíz tiene longitud de camino 1, y sus descendientes directos longitud de camino 2 y así sucesivamente.

/*
*
*  Autor Rodrigo Cofré F.
*
*
*/
//********************
// ArbolBinario.java
//********************

import arbolbinario.Leer;

public class ArbolBinario
{

    void borrarnodo() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
    class Nodo
    {
        int info;
        Nodo izq, der;
    }
    Nodo raiz;

    public ArbolBinario(){
        raiz = null;
    }
   
    public void insertar(int info)
    {

        Nodo 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 preorden (Nodo n)
    {
        if (n != null)
        {
            System.out.print(n.info + " ");
            preorden (n.izq);
            preorden (n.der);
           
        }
    }      
   
    public void preorden ()
    {
        preorden (raiz);
        System.out.println();
    }
   
    private void inorden (Nodo n)
    {
        if (n != null)
        {
            inorden (n.izq);
            System.out.print(n.info + " ");
            inorden (n.der);
        }
    }
   
    public void inorden ()
    {
        inorden (raiz);
        System.out.println();
    }
   
    private void postorden (Nodo n)
    {
        if (n != null)
        {
            postorden (n.izq);
            postorden (n.der);
            System.out.print(n.info + " ");          
        }
    }
   
    public void postorden ()
    {
        postorden (raiz);
        System.out.println();
    }
    //metodo para insertar nodos
    public void insertarteclado ()
    {
        int can;
        int num;
        System.out.print("Ingresar la Cantidad de Nodos para crear el árbol: ");
        can = Leer.datoInt();
        for (int i=0; i<can; i++)
        {
            System.out.print("Ingrese Nodo "+(i+1)+" :");
            num = Leer.datoInt();
            insertar(num);
        }
    }
    // metodo para buscar nodo en el arbol
   
    public String buscar(int num)
    {
        if (buscar(this.raiz,num)==true) return "Se ecnontro el número "+ num + " en el arbol";
        else return "No se encontro el número "+num +"en el arbol";//aqui retorna falso
    }
    private boolean buscar(Nodo n,int num)
    {
        if (n != null)
        {
            if (n.info == num) return true;
            boolean bus1 = buscar(n.izq,num);
            boolean bus2 = buscar(n.der,num);
            if((bus1 == true)||(bus2 == true)) return true;
        }
        return false;
    }
    //metodo para sumer los números del arbol
    public String sumar()
    {
        int suma = sumar(this.raiz);
        return "Suma de nodos: "+suma;
    }
   
    private int sumar(Nodo n)
    {
        if (n == null)return 0;
        int c1 = sumar(n.izq);// relaliza la suma de las posisiones izquierdas
        int c2 = sumar(n.der);// relaliza la suma de las posisiones derecha
        int c3 = c1 + c2 + n.info;
       
        return c3;//retorna la suma
    }
    //metodo para contar los nodos
    public int contar()
    {
        int cant = contar(this.raiz);
        return cant;
    }
   
    private int contar(Nodo n)
    {
        if (n==null) return 0;
        int c1 = contar (n.izq);
        int c2 = contar (n.der);
        int c3 = c1 + c2 + 1;
       
        return c3;
    }
    //metodo para sacar el promerdio de los numeros
    public String promedio()
    {
        Double prom = promedio(this.raiz);
        return "Promedio de los números: "+ prom/contar();
    }
   
    private Double promedio(Nodo n)
    {
        if (n == null) return 0.0;
        Double c1 = promedio(n.izq);
        Double c2 = promedio(n.der);
        Double c3 = c1 + c2 + n.info;
        return c3;
    }
    //metodo para retornar cantidad de números pares
    public String pares()
    {
        int cant = pares(this.raiz);
        return "Cantidad de números pares: "+cant;
    }
    int con=0;  //metodo global para que no se convierta en 0
    private int pares (Nodo n)
    {
        if (n != null)
        {
            if (n.info % 2 == 0)con++; //hace la comparacion si es par o no.
            pares (n.izq);
            pares (n.der);
        }
        return con;
    }
    // metodo para eliminar
    public void borrar (int elemento)//aqui se recibe el elemento a eliminar
    {
        raiz = borrar(this.raiz, elemento);
    }
   
    private Nodo borrar(Nodo r, int elemento)
    {
        if (r.info == elemento)//este es un caso en que el nodo r se requiere borrar del arbol
        {
            if(r.der == null && r.izq == null)
            {
                r = null;
                return r;
            }
            if(r.der == null)// caso en el que r solo tiene hijo izquierdo
            {
                r = r.izq;
                return r;    //aqui el hijo ocupa el lugar del padre
            }
            if(r.izq ==null)
            {
                r = r.der;
                return r;
            }
            //este es el caso en el que el nodo tiene dos hijos
            r.info = encontrarMaximo(r.izq); //sera igual que el nodo de mayor valor
            r = ajuste(r, r.izq, r);
            return r;//el nodo igualado de mayor valor se debe eliminar
        }
   
        if(elemento > r.info)//si el elemento buscado es mayor al del nodo actual
        {
            r.der = borrar(r.der, elemento);
            return r;
        }
   
        r.izq = borrar(r.izq, elemento);
        return r;
    }
    //este metodo sirve para econtrar al nodo maximo
    //nos ayudara para la eliminacion del nodo dado en el metodo borrar
    private int encontrarMaximo(Nodo r)
    {
        if(r.der == null)//si no hay un nodo mayor retorna el valor del nodo
            return r.info;
        return encontrarMaximo(r.der);
    }
    //metodo que elimina el nodo repetido y ajusta el arbol
    private Nodo ajuste(Nodo padre, Nodo hijo, Nodo ances)
    {
        if(hijo.der == null)
        {
            if(padre.equals(ances))
            {
                padre.izq = hijo.izq;
                return padre;
            }
            padre.der = hijo.izq;
            return padre;
        }
        return padre;
    }
   
}  
//************************************
// Principal.java
//************************************

import arbolbinario.Leer;

class principal
{
    public static void Menu()
    {
        //creo mi menu
        System.out.println("");
        System.out.println("         MENU      \n");
        System.out.println("---------------------");
        System.out.println(" [1]  Crea Arbol: se ingresan los nodos.");
        System.out.println(" [2]  Recorrido preorden");
        System.out.println(" [3]  Recorrido inorden");
        System.out.println(" [4]  Recorrido postorden ");
        System.out.println(" [5]  Realizar los tres recorridos");
        System.out.println(" [6]  Realizar la busqueda de un número");
        System.out.println(" [7]  Sumar los números");
        System.out.println(" [8]  Hallar el promedio de los nodos");
        System.out.println(" [9]  Mostrar cantidad de número pares");
        System.out.println(" [10] Eliminar nodo");
       
        System.out.println(" (0) Salir \n");
        System.out.println("Ingresar Opción \n");
    }

    public static void main(String args[])
    {
            ArbolBinario abo = new ArbolBinario ();
       
            int opc;
            Menu();
        System.out.println("Elegir opción: ");
        opc = Leer.datoInt();
        System.out.println("");
                //en cada opcion se llama a cada metodo segun corresponda
        while (opc != 0)
        {
            switch(opc)
            {
                case 0:
                {
                    System.out.println("Salir");
                    break;
                }
               
                case 1:
                {
                    abo.insertarteclado();
                    break;
                }
               
                case 2:
                {
                    System.out.println("PRE_ORDEN: ");
                    abo.preorden();
                    break;
                }
               
                case 3:
                {
                    System.out.println("IN-ORDEN: ");
                    abo.inorden();
                    break;
                }
               
                case 4:
                {
                    System.out.println("POST-ORDEN: ");
                    abo.postorden();
                    break;
                }
               
                case 5:
                {
                    System.out.println("PRE-ORDEN: ");
                    abo.preorden();
                    System.out.println("IN-ORDEN: ");
                    abo.inorden();
                    System.out.println("POST-ORDEN: ");
                    abo.postorden();
                    break;
                }
               
                case 6:
                {
                    int bus;
                    System.out.println("Ingresar el número a buscar: ");
                    bus = Leer.datoInt();
                    System.out.println("" + abo.buscar(bus));
                    break;
                }
               
                case 7:
                {
                    System.out.println("" + abo.sumar());
                    break;
                }
               
                case 8:
                {
                    Double prom = 0.0;
                    System.out.println("" + abo.promedio());
                    break;
                }
                   
                case 9:
                {
                    System.out.println("" + abo.pares());
                    break;
                }
                   
                case 10:
                {
                    abo.borrarnodo();
                    break;
                }
            }
            Menu();
                    opc = Leer.datoInt();
        }
    }


}


//***************************
//Leer.java
//***************************

package arbolbinario;

//***********************************************************************

//esta es mi clase leer que me ayuda a ingresar datos de todo tipo por teclado
import java.io.*;

public class Leer
{
    public static String dato()
    {
        String sdato = "";
        try
        {
 
            InputStreamReader isr = new InputStreamReader(System.in);
            BufferedReader flujoE = new BufferedReader(isr);
   
            sdato = flujoE.readLine();
        }
        catch(IOException e)
        {
            System.err.println("Error: "+ e.getMessage());
        }
        return sdato; //devolver dato tecleando
    }

    public static short datoShort()
    {
        try
        {
            return Short.parseShort(dato());
        }
        catch(NumberFormatException e)
        {
            return Short.MIN_VALUE;//valor más pequeño
        }
    }
    public static int datoInt()
    {
        try
        {
            return Integer.parseInt(dato());
        }
        catch(NumberFormatException e)
        {
            return Integer.MIN_VALUE;//valor mas pequeño
        }
    }

    public static long datoLong()
    {
        try
        {
            return Long.parseLong(dato());    
        }
            catch(NumberFormatException e)
        {
            return Long.MIN_VALUE; //valor mas pequeño
        }
    }

    public static float datoFloat()
    {
        try
        {
            Float f = new Float(dato());
            return f.floatValue();
        }
        catch(NumberFormatException e)
        {
            return Float.NaN;//No es un numero Valor float.
        }
    }

    public static double datoDouble()
    {
        try  
        {
            Double d = new Double(dato());
            return d.doubleValue();
        }
        catch(NumberFormatException e)
        {
            return Double.NaN;//no es un numero; valor double.
        }              
    }
}

viernes, 19 de abril de 2013

Tarea 3: Algoritmos de Búsqueda en Java - Nathalia Astorga.-

Estructuras de Datos y Algoritmos de Búsqueda

Dentro del Lenguaje JAVA y de tantos otros encontramos diversas estructuras de datos, estos se originan con la programación estructurada. Una estructura de datos es una forma de organizar un conjunto de datos elementales, con el objetivo de facilitar la manipulación de estos datos como un todo o individualmente.

Una estructura de datos define la organización e interrelación de estos, y un conjunto de operaciones que se pueden realizar sobre él. Las operaciones base de estos son:
  • Insertar, agrega nuevos elementos a la estructura.
  • Borrar, elimina un valor de la estructura.
  • Buscar, encuentra un determinado valor en la estructura para realizar una operación con este. en forma secuencial o binario.
  • Ordenamiento, ordena los elementos que pertenecen a la estructuras.
Cada estructura ofrece distintas ventajas y desventajas, siendo unas mas usadas que otras, o mas cómodas de usar dependiendo del objetivo del programa que se desea desarrollar y las funciones que este deba cumplir.

Las estructuras de datos mas usadas en la programación son:
  • Array (Vectores y Matrices)
  • Listas
  • Pilas
  • Colas
  • Arboles
  • Hash
  • etc...

Acceso a los datos

Los accesos a los datos en estas estructuras pueden ser de orden Secuencial, Directo o Aleatorio.
  • Secuencial. Para acceder a un objeto se debe acceder a los objetos almacenados previamente en el archivo. El acceso secuencial exige elemento a elemento, es necesario una exploración secuencial comenzando desde el primer elemento.
  • Directo o Aleatorio. Se accede directamente al objeto, sin recorrer los anteriores. El acceso directo permite procesar o acceder a un elemento determinado haciendo una referencia directamente por su posición en el soporte de almacenamiento.

Estructuras de datos que utilizaremos.

Arreglo
Un arreglo se usa para agrupar, almacenar y organizar datos de un mismo tipo, en un arreglo cada valor se almacena en una posición ennumerada específica dentro del arreglo. El número correspondiente a cada posición se llama índice. Normalmente el primer elemento va en el índice de valor 0. Su forma gráfica se puede apreciar de la siguiente manera:




Arbol
Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos. También se da una definición recursiva para este  "un árbol es una estructura compuesta por un dato y varios árboles", la forma gráfica se puede apreciar de la siguiente forma:


Los nodos pueden ser hijos, o padres, dependiendo de si tienen un puntero apuntando desde o hacia ellos.
Nodo Hijo: Cualquier nodo apuntado por uno de los nodos del árbol, ejemplo: 7 y 5 son hijos de 2
Nodo Padre: Nodo que contiene un puntero al nodo actual. En el ejemplo 6 es padre de 5 y 11.

Con respecto a la posición dentro del árbol tenemos:
Nodo Raíz: Este es el nodo que usaremos siempre para acceder al árbol, no tiene padre. En el ejemplo es 2.
Nodo Hoja: Nodo que no tiene hijos, en el ejemplo  hay varios, 2, 5, 11 y 4.

Otros conceptos usados en los arboles son:
Orden: es el número potencial de hijos que puede tener cada elemento del árbol.
Grado: es el número de hijos que tiene el elemento con mas hijos dentro del árbol.
Nivel: para cada elemento del árbol se define como la distancia a la raiz, esta se mide en nodos siendo siempre el nivel de la raiz 0.
Altura: es el nivel del nodo de mayor nivel.


Arboles Binarios.
Los árbol de orden o árbol binario requiere una estructura de NODO que permita almacenar el dato correspondiente, además de una referencia al Hijo Izquierdo y una al Hijo Derecho. El árbol sera una alianza al nodo raíz, y a partir de este se podrá acceder al resto de la estructura.



Algoritmos de Búsqueda

Los algoritmos de búsqueda son un conjunto de instrucciónes que permiten que se encuentre un elemento de una estructura de datos, ya sea para verificar su existencia o nulidad de esta. O para desarrollar futuras funciones con esta información.



TAREA 3 :
  • En forma individual, investigar e implementar en Java un algoritmo de búsqueda. Se recomienda que desarrolle un programa que permita crear un árbol binario, recorrerlo en diferente orden, y haber búsqueda de un elemento dentro del árbol. También puede usar otra estructura de datos.
  • Publicar en su blog y responder esta entrada, indicando su nombre y la url de su tarea en el blog de su grupo. 

Búsqueda en Arreglo




package binario;


public class Binario {


    public static void main(String[] args) {
        int arr1 [] = {1,2,3,4,5,6,7,8,9,10};
        int n = 2;
        int posini = 0;
        int posfin = arr1.length -1;
        int poscen;
        
        while(posini<=posfin)
        {
            poscen = (posfin + posini)/2;
            if(arr1[poscen]== n){
                System.out.println("Dato encontrado entre las posiciones " +posini+ " y "+posfin);
                break;
            }else if(n< arr1[poscen])
            {
                posfin = poscen-1;
            }else{
            
               posini = poscen +1;
            }
        }
    }
}



Búsqueda en árboles



public class singleNode {

    private Object info;
    public singleNode next;

    public singleNode(Object info){
        this.info = info;
        next = null;
    }

    public void setInfo(Object info){
        this.info = info;
    }

    public Object getInfo(){
        return this.info;
    }

    public Object popInfo(){
        Object temp = this.info;
        this.info = null;
        return temp;
    }

}

public class BinaryTreeNode {

    public BinaryTreeNode parent;
    public BinaryTreeNode leftChild;
    public BinaryTreeNode rightChild;

    private String info;

    public BinaryTreeNode(String info){
        this.parent = null;
        this.leftChild = null;
        this.rightChild = null;
        this.info = info;
    }

    public String getInfo(){
        return this.info;
    }

    public void setInfo(String info){
        this.info = info;
    }

}

public class BinarySearchTree {

    private BinaryTreeNode root;

    public BinarySearchTree(){
        this.root = null;
    }

    public void insertNode(BinaryTreeNode node){
        if (this.root == null){
            this.root = node;
        }
        else{
            trackPosition(node, this.root);
        }
    }

    private void trackPosition(BinaryTreeNode node, BinaryTreeNode start){
        String sInfo = start.getInfo();
        if (sInfo.compareTo(node.getInfo()) > 0){
            if (start.leftChild == null){
                start.leftChild = node;
                node.parent = start;
            }
            else{
                trackPosition(node, start.leftChild);
            }
        }
        else{
            if (start.rightChild == null){
                start.rightChild = node;
                node.parent = start;
            }
            else{
                trackPosition(node, start.rightChild);
            }
        }
    }

}



Bibliografía-

Estructura de datos en Java - Luis Joyanes, Ignacio Zahonero (McGraw Hill)

Tarea 3 - Arboles Binarios



Fundamentos de Sistemas Inteligentes – Tarea 3

Á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 más de dos hijos (de ahí el nombre "binario").

Si algún hijo tiene como referencia a NULL, es decir que no almacena ningún dato, entonces este es llamado un nodo externo. En el caso contrario el hijo es llamado un nodo interno.

Usos comunes de los árboles binarios son los árboles binarios de búsqueda (ABB), los montículos binarios y Codificación de Huffman.





Árbol Binario de Búsqueda (BST Binary Search Tree)

Un árbol binario de búsqueda es un tipo particular de árbol binario que presenta una estructura de datos en forma de árbol.

Árbol binario

La mayoría de los arboles binarios son de búsqueda:

Un árbol binario no vacío, de raíz R, es un árbol binario de búsqueda si:

·         En caso de tener subárbol izquierdo, la raíz R debe ser mayor que el valor máximo almacenado en el subárbol izquierdo, y que el subárbol izquierdo sea un árbol binario de búsqueda.

·         En caso de tener subárbol derecho, la raíz R debe ser menor que el valor mínimo almacenado en el subárbol derecho, y que el subárbol derecho sea un árbol binario de búsqueda.






Recorridos sobre árboles binarios

Ejemplo de árbol binario


Recorrido en preorden

En este tipo de recorrido se realiza cierta acción (quizás simplemente imprimir por pantalla el valor de la clave de ese nodo) sobre el nodo actual y posteriormente se trata el subárbol izquierdo y cuando se haya concluido, el subárbol derecho. Otra forma para entender el recorrido con este metodo seria seguir el orden: nodo raiz, nodo izquierdo, nodo derecho.

En el árbol de la figura el recorrido en preorden sería: 2, 7, 2, 6, 5, 11, 5, 9 y 4.



Recorrido en postorden

En este caso se trata primero el subárbol izquierdo, después el derecho y por último el nodo actual. Otra forma para entender el recorrido con este método seria seguir el orden: nodo izquierdo, nodo derecho, nodo raiz.

En el árbol de la figura el recorrido en postorden sería: 2, 5, 11, 6, 7, 4, 9, 5 y 2.



Recorrido en inorden

En este caso se trata primero el subárbol izquierdo, después el nodo actual y por último el subárbol derecho. En un ABB este recorrido daría los valores de clave ordenados de menor a mayor. Otra forma para entender el recorrido con este método seria seguir el orden: nodo izquierdo, nodo raíz, nodo derecho.

En el árbol de la figura el recorrido en inorden sería: 2, 7, 5, 6, 11, 2, 5, 4, 9.

El código del programa:

package tarea_3;

/**
 *
 * @author PABLO
 */
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();
    }
   
    String getString(int llave) {
      return buscar(llave, raiz);
    }

    String buscar(int llave, Nodo nodo) {
      if (nodo==null)
          System.out.println("El dato: " + llave + " no existe en el arreglo");
      else if (llave == nodo.info)
          return "Esta en el arbol";
          //return nodo.info;
      else if (llave < nodo.info)
          return buscar(llave, nodo.izq);
      else
          return buscar(llave, nodo.der);
      return null; // Solo para evitar el error en compilacion
    }
   
    public static void main (String [] ar)
    {
        ArbolBinarioOrdenado abo = new ArbolBinarioOrdenado ();
        System.out.println( "Insertando los siguientes valores: ");

        //insertando 10 numeros aleatorios del 0 al 99 en el arbol
        int valor;
        for (int i = 1; i<=10 ; i++)
        {
            valor = (int) (Math.random() * 100);
            System.out.print(valor + " ");
            abo.insertar(valor);
        }

        System.out.println ("Impresion preorden: ");
        abo.imprimirPre ();
        System.out.println ("Impresion entreorden: ");
        abo.imprimirEntre ();
        System.out.println ("Impresion postorden: ");
        abo.imprimirPost ();
       
        int z;
        java.util.Scanner leer=new java.util.Scanner(System.in);
        System.out.println ("Buscar: " );
       
        z=leer.nextInt();
        System.out.println ("Dato buscado: " + z);
        String k;
        k = abo.getString(z);
        System.out.println ("info: " + k);
       
  }
}

 





Algoritmo de Búsqueda en JAVA



Tarea 3 Algoritmo básico de búsqueda en Java

Investigar e implementar en Java un algoritmo de búsqueda.  Se recomienda que desarrolle un programa que permita crear un árbol binario, recorrerlo en diferente orden, y haber búsqueda de un elemento dentro del árbol. También puede usar otra estructura de datos. 

Este programa desarrollado en el lenguaje de programación Java cumple con los siguientes requerimientos.
·         Crea un menú de opciones (INSERTAR, CONSULTAR, ELIMINAR Y FINALIZAR).
·         INSERTAR: almacena el nombre de una persona en vectores estáticos tipo String de tamaño 50.
·         CONSULTAR: Utilizando el algoritmo de búsqueda secuencial pide el nombre y si lo encuentra imprime un mensaje de encontrado, en caso contrario un mensaje de no localizado.
·         ELIMINAR: Utilizando el algoritmo de búsqueda secuencial pide el nombre y si lo encuentra imprime un mensaje de encontrado y elimina el nombre ajustando el vector para no dejar espacios en blanco, en caso contrario un mensaje de no localizado.
·         FINALIZAR: Imprime los nombres almacenado y sale del programa.

package busquedasecuencial;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class BusquedaSecuencial {

    static BufferedReader br = null;
    static String N= "";
    static int n=0;
    static String[] Nombre = new String[50];
   
    public static void main (String args[]){
        br = new BufferedReader(new InputStreamReader(System.in));

        do{
            menu();
        }while(Integer.parseInt(N)!=4);
    }

    public static void menu(){
         do{
            System.out.println("Selecciona una de las opciones del menú: \n "
                                    + "1- INSERTAR \n "
                                    + "2- CONSULTAR "
                                    + "\n 3- ELIMINAR \n "
                                    + "4- FINALIZAR");
            try{
                 N = br.readLine();
            }catch(Exception e){
                e.printStackTrace();
            }
        }while(!esEntero(N) || conversor(N)<=0 || conversor(N)>=5 );

         switch(Integer.parseInt(N)){
            case 1:
                insertar();
                break;
            case 2:
                consultar();
                break;
            case 3:
                eliminar();
                break;
            case 4:
                imprimir();
                break;
        }
    }

    public static void consultar(){
        if(n>0){
            String nombre="";
            int eureka=0;

            try{
                    System.out.println("Ingrese Nombre : ");
                    nombre = br.readLine();
                }catch(Exception e){
                    e.printStackTrace();
                }

            for(int i=0; i<n; i++){
                if(Nombre[i].equals(nombre)){
                    eureka=1;
                }
            }
            if(eureka==1){
                System.out.println("Nombre encontrado!!!!!. ");
            }else{
                System.out.println("Nombre NO localizado!!!!!. ");
            }
        }
        else{
            System.out.println("No hay elementos en la lista. ");
        }

    }

    public static boolean esEntero(String cad) {
        for(int i = 0; i<cad.length(); i++)
            if( !Character.isDigit(cad.charAt(i)) )
        return false;

        return true;
    }

    public static int conversor(String x){
        int valor=0;

        try{
            valor= Integer.parseInt(x);
        }catch(NumberFormatException e){
            System.out.println("Valor invalido");
        }

        return valor;
    }

    public static void insertar(){

            if(n<50){
                System.out.println("Leyendo datos de la persona: " + (n+1));

            try{
                 System.out.println("Ingresa el nombre: ");
                 Nombre[n] = br.readLine();
            }catch(Exception e){
                e.printStackTrace();
            }

            n++;
            }else{
                System.out.println("El vector esta lleno, elimina personas para poder insertar");
            }

    }

    public static void eliminar(){
            String nombre="";
            int encontrados=0;

        if(n>0){

            try{
                    System.out.println("Ingresa el Nombre : ");
                    nombre = br.readLine();
                }catch(Exception e){
                    e.printStackTrace();
                }

            for(int i=0; i<n; i++){
                if(Nombre[i].equals(nombre)){
                    encontrados++;
                    for(int j=i; j<n; j++){
                        Nombre[j]=Nombre[j+1];
                       }
                    i--;
                    n--;
                }
            }
            if(encontrados>0){
                System.out.println("Nombre encontrado, procediendo a eliminar!!!!!. ");
            }else{
                System.out.println("Nombre NO localizado!!!!!. ");
            }
        }else{
            System.out.println("No hay elementos a eliminar.");
        }
     }
     public static void imprimir(){
        if(n>0){
            System.out.println("Nombre");
            for(int i=0; i<n; i++){
                System.out.print(Nombre [i] + ".");
                System.out.println();
            }
        }
    }
}


Erika Torres