public void Insert(T key) { BSTTreeNode <T> node = new BSTTreeNode <T>(key); BSTTreeNode <T> parentNode = null; BSTTreeNode <T> current = _Root; while (current != null) { parentNode = current; if (current.Value.CompareTo(key) > 0) { current = current.Left; } else { current = current.Right; } } node.Parent = parentNode; if (parentNode == null) { _Root = node; return; } if (parentNode.Value.CompareTo(key) > 0) { parentNode.Left = node; } else { parentNode.Right = node; } }
private BSTTreeNode <T> _Minimum(BSTTreeNode <T> node) { BSTTreeNode <T> current = node; while (current.Left != null) { current = current.Left; } return(current); }
private BSTTreeNode <T> _Maximum(BSTTreeNode <T> node) { BSTTreeNode <T> current = node; while (current.Right != null) { current = current.Right; } return(current); }
public void Delete(BSTTreeNode <T> node) { BSTTreeNode <T> delNode = null; if (node.Left == null || node.Right == null) { delNode = node; } else { delNode = Successor(node); } BSTTreeNode <T> child = null; if (delNode.Left != null) { child = delNode.Left; } else { child = delNode.Right; } if (child != null) { child.Parent = delNode.Parent; } if (delNode.Parent == null) { _Root = child; } else { if (delNode.Parent.Left == delNode) { delNode.Parent.Left = child; } else { delNode.Parent.Right = child; } } if (node != delNode) { node.Value = delNode.Value; } }
public BSTTreeNode <T> Search(T key) { BSTTreeNode <T> current = _Root; while (current != null && current.Value.CompareTo(key) != 0) { if (current.Value.CompareTo(key) > 0) { current = current.Left; } else { current = current.Right; } } return(current); }
public BSTTreeNode <T> Predecessor(BSTTreeNode <T> node) { if (node == null) { throw new ArgumentNullException(); } if (node.Left != null) { return(_Maximum(node.Left)); } var current = node; var parent = node.Parent; while (parent != null && parent.Left == current) { current = parent; parent = parent.Parent; } return(parent); }