private void RotacionSimple(NodoAVL nodo, NodoAVL padre, string tipo) { if (tipo == "derecha") { NodoAVL hijoizq = nodo.GetHijoIzquierdo(); NodoAVL hijoizqder = hijoizq.GetHijoDerecho(); if (padre != null) { if (padre.GetHijoDerecho() == nodo) { padre.SetHijoDerecho(hijoizq); } else { padre.SetHijoIzquierdo(hijoizq); } } else { this.raiz = hijoizq; } nodo.SetHijoIzquierdo(hijoizqder); hijoizq.SetHijoDerecho(nodo); nodo.SetPadre(hijoizq); if (hijoizqder != null) { hijoizqder.SetPadre(nodo); } hijoizq.SetPadre(padre); nodo.SetFe(0); hijoizq.SetFe(0); } else { NodoAVL hijoder = nodo.GetHijoDerecho(); NodoAVL hijoderizq = hijoder.GetHijoIzquierdo(); if (padre != null) { if (padre.GetHijoDerecho() == nodo) { padre.SetHijoDerecho(hijoder); } else { padre.SetHijoIzquierdo(hijoder); } } else { this.raiz = hijoder; } nodo.SetHijoDerecho(hijoderizq); hijoder.SetHijoIzquierdo(nodo); nodo.SetPadre(hijoder); if (hijoderizq != null) { hijoderizq.SetPadre(nodo); } hijoder.SetPadre(padre); hijoder.SetFe(0); nodo.SetFe(0); } }
private void EquilibrarArbol(NodoAVL nodo, string lado, bool nuevo) { bool salir = false; while (nodo != null && !salir) { if (nuevo) { if (lado == "izquierda") { int auxfe = nodo.GetFe(); auxfe -= 1; nodo.SetFe(auxfe); } else { int auxfe = nodo.GetFe(); auxfe += 1; nodo.SetFe(auxfe); } } else { if (lado == "izquierda") { int auxfe = nodo.GetFe(); auxfe += 1; nodo.SetFe(auxfe); } else { int auxfe = nodo.GetFe(); auxfe -= 1; nodo.SetFe(auxfe); } } if (nodo.GetFe() == 0) { salir = true; } else if (nodo.GetFe() == -2) { if (nodo.GetHijoIzquierdo().GetFe() == 1) { RotacionDoble(nodo, nodo.GetPadre(), "derecha"); } else { RotacionSimple(nodo, nodo.GetPadre(), "derecha"); } salir = true; } else if (nodo.GetFe() == 2) { if (nodo.GetHijoDerecho().GetFe() == -1) { RotacionDoble(nodo, nodo.GetPadre(), "izquierda"); } else { RotacionSimple(nodo, nodo.GetPadre(), "izquierda"); } salir = true; } if (nodo.GetPadre() != null) { if (nodo.GetPadre().GetHijoDerecho() == nodo) { lado = "derecha"; } else { lado = "izquierda"; } } nodo = nodo.GetPadre(); } }