/// <summary>Gets the In-Order successor of the node passed.</summary> /// <param name="node">The node.</param> /// <returns></returns> public BinarySearchTreeNode <T> InOrderSuccessor(BinarySearchTreeNode <T> node) { if (node == null) { return(null); } if (node.Right != null) { return(GetLeftMost(node.Right)); } var successor = node.Parent; while (successor != null && node == successor.Right) { node = successor; successor = successor.Parent; } return(successor); }
/// <summary>Gets the In-Order predecessor of the node passed.</summary> /// <param name="node">The node.</param> /// <returns></returns> public BinarySearchTreeNode <T> InOrderPredecessor(BinarySearchTreeNode <T> node) { if (node == null) { return(null); } if (node.Left != null) { return(GetRightMost(node.Left)); } var predecessor = node.Parent; while (predecessor != null && node == predecessor.Left) { node = predecessor; predecessor = predecessor.Parent; } return(predecessor); }
/// <summary>Adds the child.</summary> /// <param name="item">The item.</param> /// <param name="parent">The parent.</param> /// <returns></returns> private BinarySearchTreeNode <T> AddChild(T item, BinarySearchTreeNode <T> parent) => new BinarySearchTreeNode <T>(item, parent);