public BST() { Root = null; }
public BNode(T value, BNode <T> left, BNode <T> right) { base.Value = value; base.Neighbors = new List <Node <T> >(new[] { left, right }); }
public virtual void Clear() { Root = null; }
public virtual BNode <T> Remove(T value) { if (IsEmpty()) { return(null); } BNode <T> current = Root; int parentDirection = 0; while (true) { int direction = value.CompareTo(current.Value); if (direction == 0) { break; } parentDirection = direction; current = direction < 0 ? current.Left : current.Right; if (current == null) { return(null); } } if (current.Left == null && current.Right == null) // no children { if (current.Parent == null) // if root being removed { this.Root = null; } else // remove reference to current node from parent node { if (parentDirection < 0) { current.Parent.Left = null; } else { current.Parent.Right = null; } } } else if (current.Left != null && current.Right != null) // two children { BNode <T> successor = current.Right; while (successor.Left != null) { successor = successor.Left; // find smallest value greater than current value } if (successor.Parent.Left == successor) { successor.Parent.Left = null; // remove successor from tree } else { successor.Parent.Right = null; // remove successor from tree } // connect parent and successor together successor.Parent = current.Parent; // attach successor to same parent as current if (current.Parent == null) { this.Root = successor; } else { if (parentDirection < 0) { current.Parent.Left = successor; } else { current.Parent.Right = successor; } } // connect successor to children of removed node successor.Left = current.Left; successor.Right = current.Right; if (current.Left != null) { current.Left.Parent = successor; } if (current.Right != null) { current.Right.Parent = successor; } } else // one child { if (current.Parent == null) { this.Root = current.Left == null ? current.Left : current.Right; } else { BNode <T> successor = current.Right ?? current.Left; // connect parent to successor if (parentDirection > 0) { current.Parent.Right = successor; } else { current.Parent.Left = successor; } // connect successor to parent successor.Parent = current.Parent; } } return(current); }
private BST(BNode <T> root) { this.Root = root; }