/// <summary> /// despues de eliminar llamar a este metodo para reordenar el tree y realizar todas las rotaciones /// </summary> private void ReOrderRemove() { int oldFb = _fb; UpdateFb(); if (oldFb == 0 && (_fb == 1 || _fb == -1)) { return; } else if (_fb < -1 || _fb > 1) //hay desbalance { if (RotarRemove(this)) { return; } } if (Dad != null) { Dad.ReOrderRemove(); } }
/// <summary> /// elimina el nodo seleccionado de arbol /// </summary> private void Remove() { #region Caso 1 (Hoja) if (IsLeaf) { if (Dad != null) { if (SoyElDerecho) //soy el hijo derecho de mi padre { Dad.Rigth = null; } else //soy el hijo izquierdo de mi padre { Dad.Left = null; } } else { Value = default(T); } } #endregion #region Caso 2 (nodo con 1 hijo) else if (Left == null) { if (Dad != null) { if (SoyElDerecho) { Dad.Rigth = Rigth; //el derecho de mi padre es mi derecho } else //soy izquierdo { Dad.Left = Rigth; } Rigth.Dad = Dad; } else { //elimina la raiz con un hijo derecho Value = Rigth.Value; Rigth = null; UpdateFb(); } } else if (Rigth == null) { if (Dad != null) { if (SoyElDerecho) { Dad.Rigth = Left; //el derecho de mi padre es mi derecho } else //soy izquierdo { Dad.Left = Left; } Left.Dad = Dad; } else { //elimina la raiz con un hijo derecho Value = Left.Value; Left = null; UpdateFb(); } } #endregion #region Caso 3 else { OrderedList <T> m = Rigth.MenorMayores; Value = m.Value; m.Remove(); return; } #endregion if (Dad != null) { Dad.ReOrderRemove(); } }