private NodoAVL insertar(NodoAVL nodo, int dato) { if (nodo == null) { estadoProceso = 0; NodoAVL x = new NodoAVL(dato); x.asignaAltura(1); return(x); } if (dato == (int)nodo.retornaDato()) { estadoProceso = 1; //print("Dato repetido"); return(nodo); } if (dato < (int)nodo.retornaDato()) { nodo.asignaLi(insertar(nodo.retornaLi(), dato)); } else { nodo.asignaLd(insertar(nodo.retornaLd(), dato)); } nodo.asignaAltura(Math.Max(this.altura(nodo.retornaLi()), this.altura(nodo.retornaLd())) + 1); nodo = resolverDesbalanceIns(dato, nodo); return(nodo); }
private NodoAVL eliminar(NodoAVL nodo, int dato) { if (nodo == null) { estadoProceso = 1; return(null); } if (dato < (int)nodo.retornaDato()) { nodo.asignaLi(eliminar(nodo.retornaLi(), dato)); } else if (dato > (int)nodo.retornaDato()) { nodo.asignaLd(eliminar(nodo.retornaLd(), dato)); } else { estadoProceso = 0; if (nodo.retornaLi() == null && nodo.retornaLd() == null) { //print("eliminando hoja"); return(null); } if (nodo.retornaLi() == null) { //print("removiendo hijo derecho"); nodo = null; return(nodo.retornaLd()); } else if (nodo.retornaLd() == null) { //print("Removiendo hijo izquierdo"); nodo = null; return(nodo.retornaLi()); } //print("Removiendo con 2 hijos"); NodoAVL tempNodo = this.retornaPredecesor(nodo.retornaLi()); nodo.asignaDato(tempNodo.retornaDato()); nodo.asignaLi(eliminar(nodo.retornaLi(), (int)tempNodo.retornaDato())); } nodo.asignaAltura(Math.Max(this.altura(nodo.retornaLi()), this.altura(nodo.retornaLd())) + 1); return(resolverDesbalanceDel(nodo)); }
private NodoAVL rotacionALaIzq(NodoAVL nodo) { //print("Rotando a la izquierda"); NodoAVL tempNodoDer = nodo.retornaLd(); NodoAVL t = tempNodoDer.retornaLi(); tempNodoDer.asignaLi(nodo); nodo.asignaLd(t); nodo.asignaAltura(Math.Max(altura(nodo.retornaLi()), altura(nodo.retornaLd())) + 1); tempNodoDer.asignaAltura(Math.Max(altura(tempNodoDer.retornaLi()), altura(tempNodoDer.retornaLd())) + 1); return(tempNodoDer); }
private NodoAVL rotacionALaDer(NodoAVL nodo) { //print("Rotando a la derecha"); NodoAVL tempNodoIzq = nodo.retornaLi(); NodoAVL t = tempNodoIzq.retornaLd(); tempNodoIzq.asignaLd(nodo); nodo.asignaLi(t); nodo.asignaAltura(Math.Max(altura(nodo.retornaLi()), altura(nodo.retornaLd())) + 1); tempNodoIzq.asignaAltura(Math.Max(altura(tempNodoIzq.retornaLi()), altura(tempNodoIzq.retornaLd())) + 1); return(tempNodoIzq); }
private NodoAVL resolverDesbalanceDel(NodoAVL nodo) { int factBalance = this.retornaBalance(nodo); if (factBalance > 1) { if (this.retornaBalance(nodo.retornaLi()) < 0) { nodo.asignaLi(rotacionALaIzq(nodo.retornaLi())); } return(rotacionALaDer(nodo)); } if (factBalance < -1) { if (this.retornaBalance(nodo.retornaLd()) > 0) { nodo.asignaLd(rotacionALaDer(nodo.retornaLd())); } return(rotacionALaIzq(nodo)); } return(nodo); }
private NodoAVL resolverDesbalanceIns(int dato, NodoAVL nodo) { int factBalance = this.retornaBalance(nodo); if (factBalance > 1 && dato < (int)nodo.retornaLi().retornaDato()) { return(rotacionALaDer(nodo)); } if (factBalance < -1 && dato > (int)nodo.retornaLd().retornaDato()) { return(rotacionALaIzq(nodo)); } if (factBalance > 1 && dato > (int)nodo.retornaLi().retornaDato()) { nodo.asignaLi(rotacionALaIzq(nodo.retornaLi())); return(rotacionALaDer(nodo)); } if (factBalance < -1 && dato < (int)nodo.retornaLd().retornaDato()) { nodo.asignaLd(rotacionALaDer(nodo.retornaLd())); return(rotacionALaIzq(nodo)); } return(nodo); }