Está en la página 1de 19

Estructura de datos

Unidad 3. Almacenamiento

Evidencia de Aprendizaje: Árboles y Almacenamiento

Docente: JAZMIN PEREZ MENDEZ

4to Semestre

Grupo: DS-DEDA-2001-B1-003

Roberto Carlos Pavón García

Matricula: ES1821012068

23/03/2020
1. Genera un proyecto nuevo con la herramienta de desarrollo de IDE de NetBeans y crea
un proyecto que realice lo siguiente
2. Crea un árbol binario con dos grupos de datos.
3. Permita capturar id de alumno, nombre y calificación, y permita elegir a cual grupo se
asignará dicho dato
4. Imprima un menú que permita
Recorrer el árbol eligiendo el tipo de recorrido

 Pre-orden
 In-orden
 Post-orden

Incluir dos opciones más en el menú que son:

 Promediar las calificaciones de cada grupo


 Buscar un alumno

Funcionamiento del Programa


(Buscar en Alumno)
Algoritmo

Clase Main

package abb;

import javax.swing.JOptionPane;

/**

* @author Roberto

*/

public class ABB {

public static void main(String[] args) {

int opc1=0,opc2=0,opc3=0,opc4=0,opc5=0,opc6=0,opc7=0,nlista;

float cal;

String nombre;

ArbolB grupoA = new ArbolB();

ArbolB grupoB = new ArbolB();

// Se inicia el menu del programa con 5 opciones

do{

try{//bloque try catch para evitar errores al correr el programa si se ingresa un dato
incorrecto

opc1=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Agregar Alumno\n"+


"2.- Mostrar Elementos del Grupo en InOrden\n"+

"3.- Mostrar Elementos del Grupo en PreOrden\n"+

"4.- Mostrar Elementos del Grupo en PostOrden\n"+

"5.- Eliminar Alumno\n"+

"6,- Buscar Alumno\n"+

"7.- Salir\n", "Elige una Opcion",3));

// Dependiendo de la opcion elegida se inician los casos:

switch(opc1){

// esta opcion invoca el metodo para agregar un nuevo nodo o dato

case 1:

opc2=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Agregar Alumno al grupo A\n"+

"2.- Agregar Alumno al grupo B\n"+

"3.- Salir\n"));

if(opc2==1){

nlista = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingresa el numero


de lista del Alumno", "Numero de Lista",1));

nombre = JOptionPane.showInputDialog(null, "Ingresa el nombre del Alumno",


"Agregar Nodo",1);

cal = Float.parseFloat(JOptionPane.showInputDialog(null, "Ingresa la calificacion


del Alumno", "Calificacion",1));

grupoA.agregarNodo(nlista,nombre,cal);

break;

if(opc2==2){

nlista = Integer.parseInt(JOptionPane.showInputDialog(null, "Ingresa el numero


de lista del Alumno", "Numero de Lista",1));

nombre = JOptionPane.showInputDialog(null, "Ingresa el nombre del Alumno",


"Agregar Nodo",1);
cal = Float.parseFloat(JOptionPane.showInputDialog(null, "Ingresa la calificacion
del Alumno", "Calificacion",1));

grupoB.agregarNodo(nlista,nombre,cal);

break;

break;

// Este caso permite recorrer el arbol en InOrden invocando el metodo para ello

case 2:

opc3=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Recorrer Grupo A\n"+

"2.- Recorrer Grupo B\n"+

"3.- Salir\n"));

if(opc3==1){

if(!grupoA.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoA.inOrden(grupoA.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

if(opc3==2){

if(!grupoB.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoB.inOrden(grupoB.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

}
}else if (opc3==3){

JOptionPane.showMessageDialog(null, "Saliendo..", "Atras",1);

break;

// Este caso permite recorrer el arbol en PreOrden invocando el metodo para ello

case 3:

opc4=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Recorrer Grupo A\n"+

"2.- Recorrer Grupo B\n"+

"3.- Salir\n"));

if(opc3==1){

if(!grupoA.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoA.preOrden(grupoA.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

if(opc3==2){

if(!grupoB.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoB.preOrden(grupoB.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

}else{

JOptionPane.showMessageDialog(null, "Saliendo..", "Atras",1);


}

break;

// Este caso permite recorrer el arbol en PostOrden invocando el metodo para ello

case 4:

opc5=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Recorrer Grupo A\n"+

"2.- Recorrer Grupo B\n"+

"3.- Salir\n"));

if(opc3==1){

if(!grupoA.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoA.postOrden(grupoA.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

if(opc3==2){

if(!grupoB.estaVacio()){//lo primero que hace es verificar que el arbol no este vacio

System.out.println();

grupoB.postOrden(grupoB.raiz);

else{

JOptionPane.showMessageDialog(null, "El Grupo esta vacio", "Vacio",1);

}else{

JOptionPane.showMessageDialog(null, "Saliendo..", "Atras",1);

break;
case 5:

opc6=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Elimnar Alumno del Grupo A\n"+

"2.- Elimnar Alumno del Grupo B\n"+

"3.- Salir\n"));

if(opc6==1){

if(!grupoA.estaVacio()){//primero verifica que el arbol no este vacio

nlista = Integer.parseInt(JOptionPane.showInputDialog(null,

"Ingresa el numero de lista del Alumno a Eliminar:", "Eliminando


Alumno",1));

if(grupoA.eliminar(nlista)==false){//se busca el nodo a eliminar; si no lo


encuentra se muestra mensaje:

JOptionPane.showMessageDialog(null, "Alumno no encontrado! ", "Error",2);

}else{//si el elemento se encuentra, se elimina y se muestra el mensaje

JOptionPane.showMessageDialog(null, "Alumno Eliminado! ",


"ELIMINADO",2);

if(opc6==2){

if(!grupoB.estaVacio()){//primero verifica que el arbol no este vacio

nlista = Integer.parseInt(JOptionPane.showInputDialog(null,

"Ingresa el numero de lista del Alumno a Eliminar:", "Eliminando


Alumno",1));

if(grupoB.eliminar(nlista)==false){//se busca el nodo a eliminar; si no lo


encuentra se muestra mensaje:

JOptionPane.showMessageDialog(null, "Alumno no encontrado! ", "Error",2);

}else{//si el elemento se encuentra, se elimina y se muestra el mensaje

JOptionPane.showMessageDialog(null, "Alumno Eliminado! ",


"ELIMINADO",2);

}
}

break;

case 6:

opc7=Integer.parseInt(JOptionPane.showInputDialog(null,

"1.- Buscar Alumno del Grupo A\n"+

"2.- Buscar Alumno del Grupo B\n"+

"3.- Salir\n"));

if(opc7==1){

if(!grupoA.estaVacio()){//primero verifica que el arbol no este vacio

nlista = Integer.parseInt(JOptionPane.showInputDialog(null,

"Ingresa el numero de lista del Alumno a Buscar:", "Buscando Alumno",1));

if(grupoA.buscarNodo(nlista)==null){//se busca el nodo a eliminar; si no lo


encuentra se muestra mensaje:

JOptionPane.showMessageDialog(null, "Alumno no encontrado! ", "Error",2);

}else{//si el elemento se encuentra, se muestran los datos del registro

System.out.println("El registro del Alumno es: "+grupoA.buscarNodo(nlista));

if(opc7==2){

if(!grupoB.estaVacio()){//primero verifica que el arbol no este vacio

nlista = Integer.parseInt(JOptionPane.showInputDialog(null,

"Ingresa el numero de lista del Alumno a Buscar:", "Buscando Alumno",1));

if(grupoB.buscarNodo(nlista)==null){//se busca el nodo a eliminar; si no lo


encuentra se muestra mensaje:

JOptionPane.showMessageDialog(null, "Alumno no encontrado! ", "Error",2);

}else{//si el elemento se encuentra, se muestran los datos del registro

System.out.println("El registro del Alumno es: "+grupoB.buscarNodo(nlista));

}
}

break;

case 7:

JOptionPane.showMessageDialog(null, "Aplicacion Finalizada", "Salir",1);

break;

default:

JOptionPane.showMessageDialog(null, "Opcion Incorrecta ", "Error",1);

}catch(NumberFormatException n){

JOptionPane.showConfirmDialog(null, "Error"+n.getMessage());

}while(opc1!=7);

Clase Nodo

package abb;

/**

* @author Roberto

*/

public class Nodo {

// se inicializa los datos que recibira el nodo a crear y los punteros necesarios para cada nodo

int dato;
String nombre;

float cal;

Nodo izquierdo, derecho;

//se asigna el numero inresado por el usuario al nodo y sus punteros derecho e izquierdo

public Nodo(int d, String nom, Float c){

this.dato=d;

this.nombre=nom;

this.cal=c;

this.derecho=null;

this.izquierdo=null;

public String toString(){

return dato+". "+nombre+". "+cal+".";

Clase ArbolB

package abb;

/**

* @author Roberto

*/

public class ArbolB {

Nodo raiz;

int cant;
public ArbolB(){

raiz = null;

public void agregarNodo(int d, String nom, float c){

Nodo nuevo = new Nodo(d, nom, c);

if(raiz == null){

raiz=nuevo;

else{

Nodo auxiliar=raiz;

Nodo padre;

while(true){

padre=auxiliar;

if(d<auxiliar.dato){

auxiliar=auxiliar.izquierdo;

if(auxiliar==null){

padre.izquierdo=nuevo;

return;

else{

auxiliar=auxiliar.derecho;

if(auxiliar==null){

padre.derecho=nuevo;

return;

}
}

// metodo de tipo logico que indicara si el arbol esta vacio

public boolean estaVacio(){

return raiz==null;

// metodo para realizar el recorrido del arbol en inOrden

public void inOrden(Nodo r){

if(r!=null){//si la raiz del arbol no esta vacia el metodo se invoca a si mismo

// conviertiendose en una funcion recursiva donde mostrara primero los nodos

// izquierdos y despues los derechos

inOrden(r.izquierdo);

System.out.println(r.dato+". "+r.nombre+". "+r.cal+". ");

inOrden(r.derecho);

// metodo para realizar el recorrido del arbol en inOrden

public void preOrden(Nodo r){

if(r!=null){//si la raiz del arbol no esta vacia el metodo se invoca a si mismo

// conviertiendose en una funcion recursiva donde mostrara primero la raiz, despues los nodos

// izquierdos y despues los derechos

System.out.println(r.dato+". "+r.nombre+". "+r.cal+". ");

preOrden(r.izquierdo);

preOrden(r.derecho);

}
// metodo para realizar el recorrido del arbol en inOrden

public void postOrden(Nodo r){

if(r!=null){//si la raiz del arbol no esta vacia el metodo se invoca a si mismo

// conviertiendose en una funcion recursiva donde mostrara primero los nodos

// izquierdos, despues los derecho y al final la raiz

postOrden(r.izquierdo);

postOrden(r.derecho);

System.out.println(r.dato+". "+r.nombre+". "+r.cal+". ");

// metodo para eliminar un nodo

public boolean eliminar(int d){

Nodo auxiliar = raiz;

Nodo padre = raiz;

boolean hijoIz = true;

while(auxiliar.dato!=d){

padre=auxiliar;

if(d<auxiliar.dato){

hijoIz=true;

auxiliar=auxiliar.izquierdo;

else{

hijoIz=false;

auxiliar=auxiliar.derecho;

if(auxiliar==null){

return false;
}

if(auxiliar.izquierdo==null&&auxiliar.derecho==null){

if(auxiliar==raiz){

raiz=null;

else if(hijoIz){

padre.izquierdo=null;

else{

padre.derecho=null;

}else if(auxiliar.derecho==null){

if(auxiliar==raiz){

raiz=auxiliar.izquierdo;

else if(hijoIz){

padre.izquierdo=auxiliar.izquierdo;

else{

padre.derecho=auxiliar.izquierdo;

}else if(auxiliar.izquierdo==null){

if(auxiliar==raiz){

raiz=auxiliar.derecho;

else if(hijoIz){

padre.izquierdo=auxiliar.derecho;

}
else{

padre.derecho=auxiliar.izquierdo;

}else{

Nodo reemplazo=obtenerNodoReemplazo(auxiliar);

if(auxiliar==raiz){

raiz=reemplazo;

}else if(hijoIz){

padre.izquierdo=reemplazo;

}else{

padre.derecho=reemplazo;

reemplazo.izquierdo=auxiliar.izquierdo;

return true;

// metodo que devuelve el nodo reemplazo

public Nodo obtenerNodoReemplazo(Nodo nodoRem){

Nodo reemPadre=nodoRem;

Nodo reemplazo=nodoRem;

Nodo auxiliar=nodoRem.derecho;

while(auxiliar!=null){

reemPadre=reemplazo;

reemplazo=auxiliar;

auxiliar=auxiliar.izquierdo;

if(reemplazo!=nodoRem.izquierdo){

reemPadre.izquierdo=reemplazo.derecho;
reemplazo.derecho=nodoRem.derecho;

System.out.println("El nodo reemplazo es: "+ reemplazo);

return reemplazo;

// metodo para buscar un Nodo

public Nodo buscarNodo(int d){

Nodo aux =raiz;

while(aux.dato!=d){

if(d<aux.dato){

aux=aux.izquierdo;

}else{

aux=aux.derecho;

if (aux==null){

return null;

return aux;

Bibliografía
MasterHeHeGar. (08 de Noviembre de 2014). "34 - Árboles Binarios de Búsqueda, Creación e
Inserción (EDDJava)". Obtenido de YouTube: https://www.youtube.com/watch?
v=ZKnwBJ8q2TE&list=PLCLpAU8VN0j4RGemFfybZrWoSX57NbEq9&index=34

MasterHeHeGar. (08 de Noviembre de 2014). "35 - Árboles Binarios de Búsqueda, Recorrido


InOrden (EDDJava)". Obtenido de YouTube: https://www.youtube.com/watch?
v=l8XPkY_q4Qs&list=PLCLpAU8VN0j4RGemFfybZrWoSX57NbEq9&index=35
MasterHeHeGar. (28 de Noviembre de 2014). "36 - Árboles Binarios de Búsqueda, Recorrido
PreOrden (EDDJava)". Obtenido de YouTube: https://www.youtube.com/watch?v=Nz-
9ZQrhgO0&list=PLCLpAU8VN0j4RGemFfybZrWoSX57NbEq9&index=36

MasterHeHeGar. (10 de Noviembre de 2014). "37 - Árboles Binarios de Búsqueda, Recorrido


PostOrden (EDDJava)". Obtenido de YouTube: https://www.youtube.com/watch?
v=52mLzH97gYA&list=PLCLpAU8VN0j4RGemFfybZrWoSX57NbEq9&index=37

MasterHeHeGar. (15 de Noviembre de 2014). "38 - Árboles Binarios de Búsqueda, Buscar un Nodo
(EDDJava)". Obtenido de YouTube: https://www.youtube.com/watch?v=SNU7J3kkrFY&t""

Universidad Abierta y a Distancia de México. (Marzo de 2020). "Estructura de datos. Unidad 3.


Almacenamiento". Obtenido de ceit.unadmexico.mx/contenidos:
https://ceit.unadmexico.mx/contenidos/DCEIT/BLOQUE1/DS/04/DEDA/U3/descargables/
Unidad_3_Almacenamiento_DEDA.pdf

También podría gustarte