►Programadores En Java◄ [Primera Comunidad Oficial] Comunidad para compartir conocimiento acerca de este lenguaje de programacion tan interesante. Si tenés dudas, compartelas en la comunidad. Si querés aportar, tambien será bien recibido. Enjoy!!
Ver más- 2,418 Miembros
- 760 Temas
- 824 Seguidores
Ayuda con Arboles Binarios en JAVA metodo, borrar y busqueda
Hola, es que tengo 2 problemas quiero crear 2 métodos uno para hacer un recorrido en amplitud o por etapas de un árbol
y el otro método borrar un nodo de un árbol
en un árbol binario
30-5-47-18-62-24-50-96-93
Eliminar nodos:
a) Una hoja (93-50-24)
b) Tiene un hijo (5), se recorre el hijo hacía la posición del padre
c) Tiene 2 hijos (30), hay 2 formas, la primera es irse hacía el nodo izq. y de ahí todo hacía la der. hasta el final,
el último nodo será la nuieva raíz padre, la segunda opción es irse a la der. y de ahí todo hacía la izq. hasta el final
y el último nodo será la nueva raíz padre.
de antemano gracias!
- 2Calificación
- 0Seguidores
- 8.436Visitas
- 0Favoritos
Global
Argentina
Chile
Colombia
España
México
Perú
Uruguay
Venezuela
11 comentarios
public class NodoArbolBinario {
private int info = 0;
private NodoArbolBinario derecho = null;
private NodoArbolBinario izquierdo = null;
public NodoArbolBinario ( int x ) {
this.info = x;
this.derecho = null;
this.izquierdo = null;
}
public NodoArbolBinario getDerecho(){
return this.derecho;
}
public void setDerecho(NodoArbolBinario derecho){
this.derecho = derecho;
}
public int getInfo(){
return this.info;
}
public void setInfo(int info){
this.info = info;
}
public NodoArbolBinario getIzquierdo(){
return this.izquierdo;
}
public void setIzquierdo(NodoArbolBinario izquierdo){
this.izquierdo = izquierdo;
}
}
La clase tiene dos atributos del mismo tipo de la clase que indica los hijos, lo que tendrías que hacer para la búsqueda es ingresar el numero de nodo y así lo podes recuperar, el procedimiento de búsqueda es el mas importante porque lo vas a ocupar también para el borrado, para borrar tenes que introducir también el numero de nodo a borrar y una ves encontrado tenes que preguntar si tiene hijos, osea si NodoArbolBinario derecho y NodoArbolBinario izquierdo son nulos, si son nulos simplemente lo borras ya que no tiene hijos, si tiene solo un hijo, es decir que solo uno de los dos atributos no es nulo, lo borras y modificas el enlace del nodo anterior al borrado (ya sea NodoArbolBinario derecho o NodoArbolBinario izquierdo) para que apunte al hijo del borrado y el resto queda igual, si NodoArbolBinario derecho y NodoArbolBinario izquierdo no son nulos, es decir que tiene dos hijos acá la cosa se complica un poco mucho. No es un algoritmo fácil, en si el algoritmo es igual que el de una árbol binario de búsqueda al que se agregan los métodos de rotación que son los que mantienen el árbol equilibrado.
Tipicamente los métodos se llama RSI, RSD, RDI y RDD
Rotacion Simple Izquierda.
Rotacion Simple Derecha.
Rotacion Doble Izquierda.
Rotacion Doble Derecha.
Mas tarde si tengo tiempo te digo mas porque ahora no puedo, espero que te allá servido de algo.
public void borrar(Integer elemento){ // //recive el item que quiere ser borrado
root = borrar(root, elemento); // llama a la funcion recursiva(root es el nombre de mi nodo raiz)
}
private Nodo borrar(Nodo r,Integer elemento){
if(r.dato.equals(elemento)){ // caso base en el que el nodo r es el que se desea borrar
if(r.derecho == null && r.izquierda == null){ // caso a en el que el nodo es hoja
r = null;
return r;
}
if(r.derecho == null){ // caso b, tiene un solo hijo(izquierdo)
r = r.izquierda;
return r; // ahora el hijo ocupa el lugar del padre y salimos del metodo
}
if(r.izquierda == null){ // caso b, tiene un solo hijo(derecho)
r = r.derecho;
return r;
}
//caso c; tiene dos hijos
r.dato = encontrarMaximo(r.izquierda); // sera igual al nodo de mayor valor en el sub-arbol izquierdo
r = ajuste(r, r.izquierda, r);
return r;//el nodo igualado (de mayor valor) se debe eliminar para que no quede repetido
}
//si no era el nodo que se queria borrar se aprobecha su ordenamiento para buscarlo
if(elemento.compareTo(r.dato)>0){ //si el elemento buscado es mayor al del nodo actual
r.derecho = borrar(r.derecho, elemento);
return r; //lo busca recursivamente en los nodo "mayores"
}
//ultima opcion: que el elemento este en la izquierda
r.izquierda = borrar(r.izquierda, elemento);
return r;
}
//funcion que encuentra el maximo
private Integer encontrarMaximo(Nodo r){
if(r.derecho == null) //si no hay un nodo con mayor valor retorna el valor del nodo actual
return r.dato;
// sigue buscando en los nodos de mayor valor
return encontrarMaximo(r.derecho);
}
// funcion que elimina el nodo repetido y ajusta el arbol
private Nodo ajuste(Nodo padre,Nodo hijo , Nodo ances){
if(hijo.derecho == null){
if(padre.equals(ances)){
padre.izquierda = hijo.izquierda;
return padre;
}
padre.derecho = hijo.izquierda;
return padre;
}
// sigue buscando en los nodos de mayor valor
hijo = ajuste(hijo, hijo.derecho, ances);
if(padre.equals(ances))
padre.izquierda = hijo;
else padre.derecho = hijo;
return padre;
}
espero que te sirva, saludos
http://www.mediafire.com/?k263gdkbedebzwk
Espero tu ayuda gracias!!
esta las clase ABB, NodoArbol, entre otras ahi espero que me puedas ayudar
mira aqui te dijo una imagen igual:
ARRIBa les deje la imagen gracias ^_^
http://www.taringa.net/posts/apuntes-y-monografias/14985195/Arboles-binarios-de-busqueda-en-Java.html