private FindNodeResult FindNode(T infoToFind) { FindNodeResult result = new FindNodeResult { parent = null, foundNode = root }; bool foundInfo = false; while (!foundInfo && result.foundNode != null) { var compareResult = infoToFind.CompareTo(result.foundNode.info); if (compareResult > 0) { result.parent = result.foundNode; result.foundNode = result.foundNode.right; result.direction = FindDirection.Right; } else if (compareResult < 0) { result.parent = result.foundNode; result.foundNode = result.foundNode.left; result.direction = FindDirection.Left; } else { foundInfo = true; } } return(result); }
private FindNodeResult GetRightLeftMostNode(BinaryTreeNode startNode) { FindNodeResult retValue = new FindNodeResult { parent = null, foundNode = startNode }; if (startNode == null) { throw new ArgumentNullException("Invalid starting node."); } retValue.foundNode = startNode.right; retValue.parent = startNode; retValue.direction = FindDirection.Right; while (retValue.foundNode.left != null) { retValue.parent = retValue.foundNode; retValue.foundNode = retValue.foundNode.left; retValue.direction = FindDirection.Left; } return(retValue); }
public void Remove(T infoToRemove) { FindNodeResult findResult = FindNode(infoToRemove); var foundNode = findResult.foundNode; if (foundNode == null) { throw new InformationNotFoundException(); } if (foundNode.left == null && foundNode.right == null) { if (findResult.parent != null) { if (findResult.direction == FindDirection.Left) { findResult.parent.left = null; } else { findResult.parent.right = null; } } else { root = null; } } else if (foundNode.left == null) { if (findResult.direction == FindDirection.Left) { findResult.parent.left = foundNode.right; } else { findResult.parent.right = foundNode.right; } } else if (foundNode.right == null) { if (findResult.direction == FindDirection.Left) { findResult.parent.left = foundNode.left; } else { findResult.parent.right = foundNode.left; } } else { var leftMostResult = GetRightLeftMostNode(foundNode); foundNode.info = leftMostResult.foundNode.info; if (leftMostResult.direction == FindDirection.Left) { leftMostResult.parent.left = null; } else { leftMostResult.parent.right = null; } } }
public FindNodeResponse(FindNodeResult <string> FindNodeResult) { this.FindNodeResult = FindNodeResult; }