Пример #1
0
        public bool Delete(T value)
        {
            if (this.Root == null)
            {
                return(false);
            }

            if (this.Root.Value.CompareTo(value) == 0 && this.Root.IsLeaf)
            {
                this.Root = null;
                return(true);
            }

            var nodeToRemove = this.Search(value);

            if (nodeToRemove == null)
            {
                return(false);
            }

            this.Delete(nodeToRemove);
            return(true);
        }
Пример #2
0
 public void Clear()
 {
     Root = null;
 }
Пример #3
0
 // Maximum of left subtree
 public BinarySearchTreeNode <T> Predecessor(BinarySearchTreeNode <T> node)
 {
     return(Maximum(node.Left));
 }
Пример #4
0
 // Minimum of right subtree
 public BinarySearchTreeNode <T> Successor(BinarySearchTreeNode <T> node)
 {
     return(Minimum(node.Right));
 }
Пример #5
0
        private void Delete(BinarySearchTreeNode <T> node)
        {
            // if node hasn't children then just remove this node
            if (node.IsLeaf)
            {
                if (node.IsLeftChild)
                {
                    node.Parent.Left = null;
                }
                else if (node.IsRightChild)
                {
                    node.Parent.Right = null;
                }

                node.Parent = null;
                return;
            }

            // if node has only 1 child then replace node by child
            if (node.HasLeft ^ node.HasRight)
            {
                if (!node.HasParent)
                {
                    if (!node.HasRight && node.HasLeft)
                    {
                        Root = node.Left;
                    }
                    else if (node.HasRight && !node.HasLeft)
                    {
                        Root = node.Right;
                    }
                    Root.Parent = null;
                    return;
                }

                if (node.HasLeft)
                {
                    if (node.IsLeftChild)
                    {
                        node.Parent.Left = node.Left;
                    }
                    else
                    {
                        node.Parent.Right = node.Left;
                    }

                    node.Left.Parent = node.Parent;
                }
                else if (node.HasRight)
                {
                    if (node.IsLeftChild)
                    {
                        node.Parent.Left = node.Right;
                    }
                    else
                    {
                        node.Parent.Right = node.Right;
                    }

                    node.Right.Parent = node.Parent;
                }

                return;
            }

            // if node has both childs
            var successor = Successor(node);

            node.Value = successor.Value;
            this.Delete(successor);
        }