BinaryNode <T> GetParentNode(BinaryNode <T> nodeToFind, BinaryNode <T> currentNode, BinaryNode <T> parentNode) { if (currentNode == null) { return(null); } else if (currentNode.Equals(nodeToFind)) { return(parentNode); } var intComparison = nodeToFind.Value.CompareTo(currentNode.Value); switch (intComparison) { case (0): case (-1): return(GetParentNode(nodeToFind, currentNode.Left, currentNode)); case (1): return(GetParentNode(nodeToFind, currentNode.Right, currentNode)); default: return(null); } }
void Remove(BinaryNode <T> currentNode, BinaryNode <T> parentNode) { if (currentNode == null) { return; } if (currentNode.Right != null) { var leftMostNode = FindLeftMostNode(currentNode.Right); var leftMostNodeParent = GetParentNode(leftMostNode); currentNode.Value = leftMostNode.Value; if (leftMostNodeParent != null && leftMostNode.Right == null) { if (leftMostNodeParent.Equals(currentNode)) { leftMostNodeParent.Right = null; } else { leftMostNodeParent.Left = null; } } else { Remove(leftMostNode, leftMostNodeParent); } } else if (currentNode.Left != null) { var leftChildValue = currentNode.Left.Value; Remove(currentNode.Left, currentNode); currentNode.Value = leftChildValue; } else { if (currentNode.Equals(Root)) { Root = null; return; } var compareInt = currentNode.Value.CompareTo(parentNode.Value); switch (compareInt) { case (0): case (-1): parentNode.Left = null; return; case (1): parentNode.Right = null; return; default: return; } } }