Esempio n. 1
0
 public BST()
 {
     Root = null;
 }
Esempio n. 2
0
 public BNode(T value, BNode <T> left, BNode <T> right)
 {
     base.Value     = value;
     base.Neighbors = new List <Node <T> >(new[] { left, right });
 }
Esempio n. 3
0
 public virtual void Clear()
 {
     Root = null;
 }
Esempio n. 4
0
        public virtual BNode <T> Remove(T value)
        {
            if (IsEmpty())
            {
                return(null);
            }

            BNode <T> current         = Root;
            int       parentDirection = 0;

            while (true)
            {
                int direction = value.CompareTo(current.Value);
                if (direction == 0)
                {
                    break;
                }
                parentDirection = direction;
                current         = direction < 0 ? current.Left : current.Right;
                if (current == null)
                {
                    return(null);
                }
            }

            if (current.Left == null && current.Right == null) // no children
            {
                if (current.Parent == null)                    // if root being removed
                {
                    this.Root = null;
                }
                else                 // remove reference to current node from parent node
                {
                    if (parentDirection < 0)
                    {
                        current.Parent.Left = null;
                    }
                    else
                    {
                        current.Parent.Right = null;
                    }
                }
            }
            else if (current.Left != null && current.Right != null)             // two children
            {
                BNode <T> successor = current.Right;
                while (successor.Left != null)
                {
                    successor = successor.Left;                                            // find smallest value greater than current value
                }
                if (successor.Parent.Left == successor)
                {
                    successor.Parent.Left = null;                     // remove successor from tree
                }
                else
                {
                    successor.Parent.Right = null;                     // remove successor from tree
                }
                // connect parent and successor together
                successor.Parent = current.Parent;                 // attach successor to same parent as current
                if (current.Parent == null)
                {
                    this.Root = successor;
                }
                else
                {
                    if (parentDirection < 0)
                    {
                        current.Parent.Left = successor;
                    }
                    else
                    {
                        current.Parent.Right = successor;
                    }
                }

                // connect successor to children of removed node
                successor.Left  = current.Left;
                successor.Right = current.Right;
                if (current.Left != null)
                {
                    current.Left.Parent = successor;
                }
                if (current.Right != null)
                {
                    current.Right.Parent = successor;
                }
            }
            else             // one child
            {
                if (current.Parent == null)
                {
                    this.Root = current.Left == null ? current.Left : current.Right;
                }
                else
                {
                    BNode <T> successor = current.Right ?? current.Left;

                    // connect parent to successor
                    if (parentDirection > 0)
                    {
                        current.Parent.Right = successor;
                    }
                    else
                    {
                        current.Parent.Left = successor;
                    }

                    // connect successor to parent
                    successor.Parent = current.Parent;
                }
            }

            return(current);
        }
Esempio n. 5
0
 private BST(BNode <T> root)
 {
     this.Root = root;
 }