protected override IBinaryTreeNode <ValueType> Remove(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer) { return(Balance(base.Remove(node, value, prefer))); }
protected virtual IBinaryTreeNode <ValueType> Remove(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer) { if (node == null) { return(null); } int result = value.CompareTo(node.value); if (result < 0) { node.SetLeftChild(Remove(node.leftChild, value, prefer)); } else if (result > 0) { node.SetRightChild(Remove(node.rightChild, value, prefer)); } else { if (node.leftChild != null && node.rightChild != null) { if (prefer == RemovePrefer.Left) { RemoveLeft(node, value, prefer); } else if (prefer == RemovePrefer.Right) { RemoveRight(node, value, prefer); } else { return(null); } } else if (node.leftChild != null && node.rightChild == null) { RemoveLeft(node, value, prefer); } else if (node.leftChild == null && node.rightChild != null) { RemoveRight(node, value, prefer); } else { return(null); } } return(node); }
protected virtual IBinaryTreeNode <ValueType> RemoveRight(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer) { IBinaryTreeNode <ValueType> rightMin = FindMin(node.rightChild); node.value = rightMin.value; node.SetRightChild(Remove(node.rightChild, node.value, prefer)); return(node); }
public virtual void Remove(ValueType value, RemovePrefer prefer) { head = Remove(head, value, prefer); }
protected virtual IBinaryTreeNode <ValueType> RemoveLeft(IBinaryTreeNode <ValueType> node, ValueType value, RemovePrefer prefer) { IBinaryTreeNode <ValueType> leftMax = FindMax(node.leftChild); node.value = leftMax.value; node.SetLeftChild(Remove(node.leftChild, node.value, prefer)); return(node); }