예제 #1
0
        /// <summary>
        /// Tar bort ett värde ur sökträdet.
        /// </summary>
        /// <param name="value">Värdet som ska tas bort.</param>
        public bool Remove(T value)
        {
            // Ifall roten är tom så kan vi ej ta bort något
            if (_root == null)
            {
                return(false);
            }

            // ifall det finns ett vänster- eller högerbarn
            // låt noden hantera borttagandet av värdet
            if (_root.LeftChild != null || _root.RightChild != null)
            {
                _root.Remove(value);
            }
            // ifall det finns en rot men ej några barn-noder
            // kontrollera ifall roten innehåller det sökta värdet
            else if (_root.Value.CompareTo(value) == 0)
            {
                _root = null;
            }
            return(true);
        }
예제 #2
0
        public void Remove(T value)
        {
            if (value.CompareTo(Value) == 0)
            {
                //Required for the GUI to work.
                Parent.IsChanged = true;


                //Om noden ej har barn.
                if (_rightChild == null && _leftChild == null)
                {
                    if (IsLeftChild)
                    {
                        _parent._leftChild = null;
                    }
                    else
                    {
                        _parent._rightChild = null;
                    }
                }
                //Om noden har ett högerbarn
                else if (_leftChild == null)
                {
                    if (IsLeftChild)
                    {
                        _parent._leftChild  = _rightChild;
                        _rightChild._parent = _parent;
                    }

                    else
                    {
                        _parent._rightChild = _rightChild;
                        _rightChild._parent = _parent;
                    }
                }
                //Om noden har ett vänsterbarn
                else if (_rightChild == null)
                {
                    if (IsLeftChild)
                    {
                        _parent._leftChild = _leftChild;
                        _leftChild._parent = _parent;
                    }
                    else
                    {
                        _parent._rightChild = _leftChild;
                        _leftChild._parent  = _parent;
                    }
                }

                //Om noden har 2 barn. Då ersätts den borttagna noden med det största värdet i vänster subträd
                else
                {
                    BinarySearchTreeNode <T> largestValue = this._leftChild;
                    while (largestValue._rightChild != null)
                    {
                        largestValue = largestValue._rightChild;
                    }
                    this._leftChild.Remove(largestValue.Value);
                    _value = largestValue.Value;
                }
            }

            //Letar efter noden som skall tas bort
            else if (value.CompareTo(_value) > 0)
            {
                _rightChild.Remove(value);
            }
            else
            {
                _leftChild.Remove(value);
            }
        }