// NODO import java.util.ArrayList; public class NodoABB { Integer info; public NodoABB izq; public NodoABB der; public NodoABB (int info){ this.info = info; izq=der= null; } public void insertar(NodoABB nuevo){ if (info > nuevo.info){ if (izq == null) izq = nuevo; else izq.insertar(nuevo); }else{ if (der == null) der = nuevo; else der.insertar(nuevo); } } public void eliminar(NodoABB padre, String izqDer, int info){ if (this.info == info){ if (esHoja()){ if (izqDer == "izq"){ //vine por izquierda padre.izq = null; }else{ padre.der = null; } }else{ // por hipotesis tengo derecha o izquieda if (izq != null ){ //tomo el maximo de la izquierda this.info = izq.maximo(); izq.eliminar(this, "izq", this.info); }else{ this.info = der.minimo(); der.eliminar(this, "der", this.info); } } }else{ //iteracion if (infothis.info && der != null) der.eliminar(this,"der", info); } } boolean pertenece(int dato){ if (dato==this.info) return true; if(datoinfo && der!=null) return der.pertenece(dato); return false; } int cantNodos(){ int ret= 1; if (izq!=null) ret= ret + izq.cantNodos(); if (der!=null) ret= ret + der.cantNodos(); return ret; } public int altura(){ //cota superior O(n^2) int altIzq = 0, altDer= 0; if(izq!=null) altIzq= izq.altura(); if(der!=null) altIzq= der.altura(); return 1 + Math.max( altIzq, altDer ); } boolean balanceado(){ //O(log n) Integer altI= 0, altD= 0; if(izq!=null) altI= izq.altura(); if(der!=null) altD= der.altura(); boolean ret= true; ret = Math.abs(altI-altD) <=1; if (izq!=null) ret= ret && izq.balanceado(); if (der!=null) ret= ret && der.balanceado(); return ret; } public Integer balanceado2() { //O(n) Integer altI= 0, altD= 0; if (izq!=null) altI= izq.balanceado2(); if (der!=null) altD= der.balanceado2(); if( altI < 0 || altD < 0 ) return -1; if(Math.abs(altI- altD) >1) return -1; else return 1 + Math.max(altI, altD); } public void imprimirPreOrden() { // PREORDEN= Actual + Pre(izq) + Pre(der) System.out.println(info + " "); if(izq!=null) izq.imprimirPreOrden(); if(der!=null) der.imprimirPreOrden(); } public void imprimirInOrden() { //INORDEN= In(izq) + Actual + In(der) if(izq!=null) izq.imprimirInOrden(); System.out.println(info + " "); if(der!=null) der.imprimirInOrden(); } public void toListPreOrden(ArrayList lista) { // PREORDEN= Actual + Pre(izq) + Pre(der) lista.add(info); if(izq!=null) izq.toListInOrden(lista); if(der!=null) der.toListInOrden(lista); } public void toListInOrden(ArrayList lista) { //INORDEN= In(izq) + Actual + In(der) if(izq!=null) izq.toListInOrden(lista); lista.add(info); if(der!=null) der.toListInOrden(lista); } public void clonarArbol(ABB nuevoArbol) { if(izq!=null) izq.clonarArbol(nuevoArbol); nuevoArbol.insertar(info); if(der!=null) der.clonarArbol(nuevoArbol); } public String toString(){ // inOrder String ret =""; if (izq != null) ret = ret + izq.toString(); ret =ret + info + " "; if (der != null) ret = ret + der.toString(); return ret; } public NodoABB buscar (NodoABB raíz, int dato){ NodoABB actual = raíz; while (actual.info != dato) { if (dato < actual.info) actual = actual.izq; else actual = actual.der; if (actual == null) return null; } return actual; } private Integer minimo() { int min; if(this.izq==null) min= this.info; else min= this.izq.minimo(); return min; } private Integer maximo() { int max; if(this.der==null) max= this.info; else max= this.der.maximo(); return max; } public boolean esHoja(){ return (izq == null) && (der == null); } } //&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // ABB import java.util.ArrayList; import java.util.List; public class ABB { public NodoABB raiz; //No tenemos constructor! public void insertar(int info){ NodoABB nuevo = new NodoABB(info); if (raiz == null){ raiz = nuevo; }else{ raiz.insertar(nuevo); } } public void eliminar(int info){ if (raiz != null){ //caso base1 if (raiz.info == info && raiz.esHoja()){ //caso base2 raiz = null; }else{ raiz.eliminar(null,null, info); // (el raiz no tiene padre) } } } boolean pertenece(int dato){ if (raiz==null) return false; else return raiz.pertenece(dato); } int cantNodos(){ int ret= 0; if(raiz!=null) ret= raiz.cantNodos(); return ret; } int altura(){ if(raiz!=null) return raiz.altura(); return 0; } boolean balanceado(){ if(raiz==null) return true; else return raiz.balanceado(); } boolean balanceado2(){ if(raiz==null) return true; else return raiz.balanceado2() >-1; } public void imprimirPreOrden(){ if(raiz==null) System.out.println(""); else raiz.imprimirPreOrden(); } public void imprimirInOrden(){ if(raiz==null) System.out.println(""); else raiz.imprimirInOrden(); } public ArrayList toListPreOrden() { //PREORDEN= Actual + Pre(izq) + Pre(der) ArrayList lista= new ArrayList(); if(raiz!=null) raiz.toListPreOrden(lista); return lista; } public ArrayList toListInOrden() { ArrayList lista= new ArrayList(); if(raiz!=null) raiz.toListInOrden(lista); return lista; } public ABB clonarArbol(){ ABB nuevoArbol= new ABB(); if( raiz!=null ){ raiz.clonarArbol(nuevoArbol); } return nuevoArbol; } public String toString(){ String ret= " "; if (raiz!=null) ret= raiz.toString(); return ret; } } //^&^&^&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& // MAIN package clase4b; public class Main { public static void main(String[] args) { ABB a= new ABB(); ABB b= new ABB(); a.insertar(8); a.insertar(5); a.insertar(6); a.insertar(4); a.insertar(10); a.insertar(9); a.insertar(11); b= a.clonarArbol(); b.eliminar(6); a.eliminar(9); System.out.println("Arbol a: " + a.toString()); System.out.println("Arbol b: " + b.toString()); System.out.println( "cantidad de nodos en a: " + a.cantNodos() ); System.out.println( "altura en b: " + b.altura() ); System.out.println( "a esta balanceado? " + a.balanceado() ); System.out.println("Pertenece? " + a.pertenece(6)); } }