Beispiel #1
0
        /// <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();
            }
        }
Beispiel #2
0
        /// <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();
            }
        }