Arboles binarios de búsqueda
Java
179.068 visualizaciones desde el 30 de Noviembre del 2012
Implementación de arboles binarios de búsqueda.
public class abb {
private class nodoArbol {
private abb hd;
private abb hi;
private int dato;
private void nodoArbol(){
hd = null;
hi = null;
dato = 0;
}
}
public nodoArbol raiz;
public void abb(){
nodoArbol raiz = new nodoArbol();
}
public boolean esVacio(){
return (raiz == null);
}
public void insertar(int a){
if (esVacio()) {
nodoArbol nuevo = new nodoArbol();
nuevo.dato = a;
nuevo.hd = new abb();
nuevo.hi = new abb();
raiz = nuevo;
}
else {
if (a > raiz.dato) {
(raiz.hd).insertar(a);
}
if (a < raiz.dato){
(raiz.hi).insertar(a);
}
}
}
public void preOrder(){
if (!esVacio()) {
System.out.print( raiz.dato + ", " );
raiz.hi.preOrder();
raiz.hd.preOrder();
}
}
public void inOrder(){
if (!esVacio()) {
raiz.hi.inOrder();
System.out.print( raiz.dato + ", " );
raiz.hd.inOrder();
}
}
public void posOrder(){
if (!esVacio()) {
raiz.hd.posOrder();
raiz.hi.posOrder();
System.out.print( raiz.dato + ", " );
}
}
public abb buscar(int a){
abb arbolito = null;
if (!esVacio()) {
if (a == raiz.dato) {
return this;
}
else {
if (a < raiz.dato) {
arbolito = raiz.hi.buscar(a);
}
else {
arbolito = raiz.hd.buscar(a);
}
}
}
return arbolito;
}
public boolean existe(int a){
if (!esVacio()) {
if (a == raiz.dato) {
return true;
}
else {
if (a < raiz.dato) {
raiz.hi.existe(a);
}
else {
raiz.hd.existe(a);
}
}
}
return false;
}
public int cantidad(){
if (esVacio()) {
return 0;
}
else {
return (1 + raiz.hd.cantidad() + raiz.hi.cantidad());
}
}
public int altura() {
if (esVacio()) {
return 0;
}
else {
return (1 + Math.max(((raiz.hi).altura()), ((raiz.hd).altura())));
}
}
public int buscarMin() {
abb arbolActual = this;
while( !arbolActual.raiz.hi.esVacio() ) {
arbolActual = arbolActual.raiz.hi;
}
int devuelvo= arbolActual.raiz.dato;
arbolActual.raiz=null;
return devuelvo;
}
public int buscarMan() {
abb arbolActual = this;
while( !arbolActual.raiz.hd.esVacio() ) {
arbolActual = arbolActual.raiz.hd;
}
int devuelvo= arbolActual.raiz.dato;
arbolActual.raiz=null;
return devuelvo;
}
public boolean esHoja() {
boolean hoja = false;
if( (raiz.hi).esVacio() && (raiz.hd).esVacio() ) {
hoja = true;
}
return hoja;
}
public void eliminar(int a) {
abb paraEliminar = buscar(a);
if (!paraEliminar.esVacio()) {
if (paraEliminar.esHoja()) {
paraEliminar.raiz = null;
}
else {
if (!paraEliminar.raiz.hi.esVacio() && !paraEliminar.raiz.hd.esVacio()) {
paraEliminar.raiz.dato = paraEliminar.raiz.hd.buscarMin();
}
else {
if (paraEliminar.raiz.hi.esVacio()) {
paraEliminar.raiz = paraEliminar.raiz.hd.raiz;
}else{
paraEliminar.raiz = paraEliminar.raiz.hi.raiz;
}
}
}
}
}
}
Comentarios sobre la versión: Versión 1 (27)
Nuevamente muy bueno el aporte!
Ejemplo: ab.eliminar(4);
import javax.swing.JOptionPane;
public class Arbol
{
private static NodoArbol Raiz;
public static String cad="";
public Arbol()
{
Raiz = null;
}
public static String PedirDato(String Cad){
return (JOptionPane.showInputDialog(null,"Digite un dato "+Cad));
}
public void InsertarNodo()
{
NodoArbol Nvo;
boolean Insertado=false;
NodoArbol R;
if(Raiz == null)
{
Raiz = new NodoArbol(PedirDato("a insertar "));
}
else
{
Nvo = new NodoArbol(PedirDato("a insertar "));
R=Raiz;
while(Insertado==false)
{
if(Nvo.Nombre.compareTo(R.Nombre)>0){
if(R.Der == null)
{
R.Der = Nvo;
R=Nvo;
Insertado=true;
}
else
{
R = R.Der;
}
}
if(Nvo.Nombre.compareTo(R.Nombre)<0)
{
if(R.Izq == null)
{
R.Izq = Nvo;
R=Nvo;
Insertado = true;
}
else
{
R= R.Izq;
}
}
}
}
}
public void eliminar(NodoArbol raiz, String dato){
if(raiz==null)
{
JOptionPane.showMessageDialog(null,"No encontrado");
}
else
if(raiz.Nombre.compareTo(dato)==0)
{
raiz.Nombre=ordenar (raiz);
ordenar(raiz);
JOptionPane.showMessageDialog(null,"Cambio hecho");
}
else
if(dato.compareTo(raiz.Nombre)<0)
{
eliminar(raiz.Izq,dato);
}
else
if(dato.compareTo(raiz.Nombre)>0)
{
eliminar(raiz.Der,dato);
}
}
public void buscar(NodoArbol raiz, String dato)
{
if(raiz==null)
{
JOptionPane.showMessageDialog(null,"No encontrado");
}
else
if(raiz.Nombre.compareTo(dato)==0)
{
JOptionPane.showMessageDialog(null,"Encontrado");
raiz=null;
}
else if(dato.compareTo(raiz.Nombre)<0)
{
eliminar(raiz.Izq,dato);
}
else
if(dato.compareTo(raiz.Nombre)>0)
{
eliminar(raiz.Der,dato);
}
}
public String ordenar(NodoArbol raiz){
if(raiz.Izq==null&&raiz.Der==null){
raiz=null;
return "0";
}
if(raiz.Izq==null){
String b="0";
NodoArbol a=raiz.Der;
while(a.Izq!=null){
a=a.Izq;
}
b=a.Nombre;
a.Nombre="0";
a=null;
return b;
}
String b="0";
NodoArbol a=raiz.Izq;
while(a.Der!=null){
a=a.Der;
}
b=a.Nombre;
a.Nombre="0";
a=null;
return b;
}
public void preorden(NodoArbol raiz)
{
if(raiz==null)
{
return;
}
else
{
if(raiz.Nombre.compareTo("0")!=0)
{
cad+=raiz.Nombre+" ";
}
preorden(raiz.Izq);
preorden(raiz.Der);
}
}
public void inorden(NodoArbol raiz)
{
if(raiz==null)
{
return;
}
else
{
inorden(raiz.Izq);
if(raiz.Nombre.compareTo("0")!=0)
{
cad+=raiz.Nombre+" ";
}
inorden(raiz.Der);
}
}
public void postorden(NodoArbol raiz)
{
if(raiz==null)
{
return;
}
else
{
postorden(raiz.Izq);
postorden(raiz.Der);
if(raiz.Nombre.compareTo("0")!=0)
{
cad+=raiz.Nombre+" ";
}
}
}
public static void recorrido(NodoArbol r,Arbol a)
{
String menu="RECORRIDOS\n"
+"1.-Presorden\n"
+"2.-Inorden\n"
+"3.-Postorden\n"
+"4.-Salir";
int opc=0;
do{
opc=Integer.parseInt(JOptionPane.showInputDialog(null,menu));
switch(opc)
{
case 1:cad="";a.preorden(r);JOptionPane.showMessageDialog(null,cad);break;
case 2:cad="";a.inorden(r);JOptionPane.showMessageDialog(null,cad);break;
case 3:cad="";a.postorden(r);JOptionPane.showMessageDialog(null,cad);break;
default: JOptionPane.showMessageDialog(null,"Opcion Incorrecta");
}
}while(opc!=4);
}
public static void main(String[] var)
{
Arbol a=new Arbol();
String menu="MENU\n"
+"1.-Insertar\n"
+"2.-buscar\n"
+"3.-Eliminar\n"
+"4.-Recorridos\n"
+"5.-Salir\n"
+"Digite una Opcion";
int opc=0;
do{
opc=Integer.parseInt(JOptionPane.showInputDialog(null,menu));
switch(opc)
{
case 1:a.InsertarNodo();break;
case 2:String x1=a.PedirDato("a buscar"); a.buscar(Raiz,x1); break;
case 3:String x=a.PedirDato("a eliminar"); a.eliminar(Raiz,x); break;
case 4:NodoArbol r=Raiz;a.recorrido(r,a);break;
default: JOptionPane.showMessageDialog(null,"Opcion Incorrecta");
}
}while(opc!=5);
}
}
Les agradezco demasiado.
ejemplo
2x+3y-2
y me imprima esos datos en inorden
arbol tipo entero: http://adf.ly/1kmPVb
Según el recorrido en Post Orden
(Nodo Izquierdo - Nodo Derecho - Raíz)
El método en Post Orden debería ser así:
public void posOrder(){
if (!esVacio()) {
raiz.hi.posOrder(); // nodo izquierdo primero
raiz.hd.posOrder(); // nodo derecho
System.out.print( raiz.dato + ", " ); // raiz
}
}
Ya que estoy trabajando en un árbol binario.
Aunque en mi caso la menor cantidad de texto irá a la izquierda y la mayor cantidad de texto irá a la derecha.