Esempio n. 1
0
        public void Insert(T key)
        {
            BSTTreeNode <T> node       = new BSTTreeNode <T>(key);
            BSTTreeNode <T> parentNode = null;
            BSTTreeNode <T> current    = _Root;

            while (current != null)
            {
                parentNode = current;
                if (current.Value.CompareTo(key) > 0)
                {
                    current = current.Left;
                }
                else
                {
                    current = current.Right;
                }
            }
            node.Parent = parentNode;
            if (parentNode == null)
            {
                _Root = node;
                return;
            }

            if (parentNode.Value.CompareTo(key) > 0)
            {
                parentNode.Left = node;
            }
            else
            {
                parentNode.Right = node;
            }
        }
Esempio n. 2
0
        private BSTTreeNode <T> _Minimum(BSTTreeNode <T> node)
        {
            BSTTreeNode <T> current = node;

            while (current.Left != null)
            {
                current = current.Left;
            }
            return(current);
        }
Esempio n. 3
0
        private BSTTreeNode <T> _Maximum(BSTTreeNode <T> node)
        {
            BSTTreeNode <T> current = node;

            while (current.Right != null)
            {
                current = current.Right;
            }
            return(current);
        }
Esempio n. 4
0
        public void Delete(BSTTreeNode <T> node)
        {
            BSTTreeNode <T> delNode = null;

            if (node.Left == null || node.Right == null)
            {
                delNode = node;
            }
            else
            {
                delNode = Successor(node);
            }

            BSTTreeNode <T> child = null;

            if (delNode.Left != null)
            {
                child = delNode.Left;
            }
            else
            {
                child = delNode.Right;
            }

            if (child != null)
            {
                child.Parent = delNode.Parent;
            }

            if (delNode.Parent == null)
            {
                _Root = child;
            }
            else
            {
                if (delNode.Parent.Left == delNode)
                {
                    delNode.Parent.Left = child;
                }
                else
                {
                    delNode.Parent.Right = child;
                }
            }

            if (node != delNode)
            {
                node.Value = delNode.Value;
            }
        }
Esempio n. 5
0
        public BSTTreeNode <T> Search(T key)
        {
            BSTTreeNode <T> current = _Root;

            while (current != null && current.Value.CompareTo(key) != 0)
            {
                if (current.Value.CompareTo(key) > 0)
                {
                    current = current.Left;
                }
                else
                {
                    current = current.Right;
                }
            }
            return(current);
        }
Esempio n. 6
0
        public BSTTreeNode <T> Predecessor(BSTTreeNode <T> node)
        {
            if (node == null)
            {
                throw new ArgumentNullException();
            }

            if (node.Left != null)
            {
                return(_Maximum(node.Left));
            }

            var current = node;
            var parent  = node.Parent;

            while (parent != null && parent.Left == current)
            {
                current = parent;
                parent  = parent.Parent;
            }
            return(parent);
        }