public void Remove(T value) { if (Head == null) { return; } Node <T> removalNode = Find(value); if (removalNode.ChildCount() == 0) { if (removalNode.IsRightChild() == Node <T> .ChildType.Right) { removalNode.Parent.Right = null; removalNode = null; } else if (removalNode.IsRightChild() == Node <T> .ChildType.Left) { removalNode.Parent.Left = null; removalNode = null; } else { removalNode = null; return; } Count--; return; } else if (removalNode.ChildCount() == 1) { if (removalNode.IsRightChild() == Node <T> .ChildType.Right) { removalNode.Child().Parent = removalNode.Parent; removalNode.Parent.Right = removalNode.Child(); } else if (removalNode.IsRightChild() == Node <T> .ChildType.Left) { removalNode.Child().Parent = removalNode.Parent; removalNode.Parent.Left = removalNode.Child(); } } else if (removalNode.ChildCount() == 2) { Node <T> temp = removalNode.Left; temp = max(temp); T val = temp.Value; Remove(val); removalNode.Value = val; } }