private IEnumerator <T> GetPostOrderEnumerator() { Stack <AvlNode <T> > stack = new Stack <AvlNode <T> >(); AvlNode <T> current = Root; AvlNode <T> lastVisited = null; while (current.IsNotNull()) { for (; current.Left.IsNotNull(); current = current.Left) { stack.Push(current); } while (current.IsNotNull() && (current.Right.IsNull() || current.Right == lastVisited)) { yield return(current.Item); lastVisited = current; if (stack.IsEmpty) { yield break; } current = stack.Pop(); } stack.Push(current); current = current.Right; } }
// T(n) = O(n); S(n) = O(h) (height) private IEnumerator <T> GetInOrderEnumerator() { Stack <AvlNode <T> > stack = new Stack <AvlNode <T> >(); AvlNode <T> current = Root; while (current.IsNotNull() || !stack.IsEmpty) { while (current.IsNotNull()) { stack.Push(current); current = current.Left; } if (!stack.IsEmpty) { current = stack.Pop(); yield return(current.Item); current = current.Right; } } }
protected AvlNode <T> FindMin(AvlNode <T> tree) { if (tree.IsNotNull()) { while (tree.Left.IsNotNull()) { tree = tree.Left; } } return(tree); }
protected AvlNode <T> FindMax(AvlNode <T> tree) { if (tree.IsNotNull()) { while (tree.Right.IsNotNull()) { tree = tree.Right; } } return(tree); }
private AvlNode <T> Find(AvlNode <T> node, T item) { AvlNode <T> current = node; while (current.IsNotNull()) { if (current.Item.CompareTo(item) == 0) { return(current); // Match } else if (current.Item.CompareTo(item) > 0) { current = current.Left; } else { current = current.Right; } } return(null); // Not found. }