/// <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); }
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); } }