예제 #1
0
        public BinNode <T> RemoveAt(BinNode <T> n)
        {
            BinNode <T> ret = null;

            if (n.HasRC() && n.HasLC())
            {
                var succ = n.Succ;
                ret = succ.Parent;
                var temp = succ.data;
                succ.data = n.data;
                n.data    = temp;
                var succParent = succ.Parent;
                if (succParent == n)
                {
                    succParent.RC = succ.RC;
                }
                else
                {
                    succParent.LC = succ.RC;
                }
                if (succ.RC != null)
                {
                    succ.RC.Parent = succParent;
                }
            }
            else
            {
                ret = n.Parent;
                var child = n.HasLC() ? n.LC : n.RC;
                if (child != null)
                {
                    child.Parent = n.Parent;
                }
                if (n.IsRoot())
                {
                    this.Root = child;
                }
                else if (n.IsLC())
                {
                    n.Parent.LC = child;
                }
                else
                {
                    n.Parent.RC = child;
                }
            }
            return(ret);
        }
예제 #2
0
 public BinNode <T> SearchIn(T e, BinNode <T> node)
 {
     while (node != null && comparer != null)
     {
         int comRet = comparer.Compare(e, node.data);
         if (comRet == 0)
         {
             return(node);
         }
         else if (comRet < 0 && node.HasLC())
         {
             node = node.LC;
         }
         else if (comRet > 0 && node.HasRC())
         {
             node = node.RC;
         }
         else
         {
             return(node);
         }
     }
     return(null);
 }