private void RotacionDoble(NodoAVL nodo, NodoAVL padre, string tipo) { if (tipo == "derecha") { NodoAVL hijoizq = nodo.GetHijoIzquierdo(); NodoAVL hijoizqder = hijoizq.GetHijoDerecho(); NodoAVL hijoizqderizq = hijoizqder.GetHijoIzquierdo(); NodoAVL hijoizqderder = hijoizqder.GetHijoDerecho(); if (padre != null) { if (padre.GetHijoDerecho() == nodo) { padre.SetHijoDerecho(hijoizqder); } else { padre.SetHijoIzquierdo(hijoizqder); } } else { this.raiz = hijoizqder; } hijoizq.SetHijoDerecho(hijoizqderizq); nodo.SetHijoIzquierdo(hijoizqderder); hijoizqder.SetHijoIzquierdo(hijoizq); hijoizqder.SetHijoDerecho(nodo); hijoizqder.SetPadre(padre); nodo.SetPadre(hijoizqder); hijoizq.SetPadre(hijoizqder); if (hijoizqderizq != null) { hijoizqderizq.SetPadre(hijoizq); } if (hijoizqderder != null) { hijoizqderder.SetPadre(nodo); } if (hijoizqder.GetFe() == -1) { hijoizq.SetFe(0); nodo.SetFe(1); } else if (hijoizqder.GetFe() == 0) { hijoizq.SetFe(0); nodo.SetFe(0); } else { hijoizq.SetFe(-1); nodo.SetFe(0); } hijoizqder.SetFe(0); } else { NodoAVL hijoder = nodo.GetHijoDerecho(); NodoAVL hijoderizq = hijoder.GetHijoIzquierdo(); NodoAVL hijoderizqizq = hijoderizq.GetHijoIzquierdo(); NodoAVL hijodereizqder = hijoderizq.GetHijoDerecho(); if (padre != null) { if (padre.GetHijoDerecho() == nodo) { padre.SetHijoDerecho(hijoderizq); } else { padre.SetHijoIzquierdo(hijoderizq); } } else { this.raiz = hijoderizq; } nodo.SetHijoDerecho(hijoderizqizq); hijoderizqizq.SetHijoIzquierdo(hijodereizqder); hijoderizq.SetHijoIzquierdo(nodo); hijoderizq.SetHijoDerecho(hijoder); hijoderizq.SetPadre(padre); nodo.SetPadre(hijoderizq); hijoder.SetPadre(hijoderizq); if (hijoderizqizq != null) { hijoderizqizq.SetPadre(nodo); } if (hijodereizqder != null) { hijodereizqder.SetPadre(hijoder); } if (hijoderizq.GetFe() == -1) { nodo.SetFe(0); hijoder.SetFe(1); } else if (hijoderizq.GetFe() == 0) { nodo.SetFe(0); hijoder.SetFe(0); } else { nodo.SetFe(-1); hijoder.SetFe(0); } hijoderizq.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(); } }