using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace TestIterator { class BSTNode<T> where T : IComparable { public BSTNode<T> left; public BSTNode<T> right; public T data; public BSTNode(T elem) { left = null; right = null; data = elem; } } class BST<T> : IEnumerable<T> where T : IComparable { private BSTNode<T> mRoot; public void insert(T elem) { insert(elem, ref mRoot); } private IEnumerable<T> traverseTree(BSTNode<T> tree) { if (tree != null) { foreach (T leftTreeElem in traverseTree(tree.left)) yield return leftTreeElem; yield return tree.data; foreach (T rightTreeElem in traverseTree(tree.right)) yield return rightTreeElem; } } private void insert(T elem, ref BSTNode<T> root) { if (root == null) { root = new BSTNode<T> (elem); } else if (elem.CompareTo(root.data) < 0) { insert(elem, ref root.left); } else { insert(elem, ref root.right); } } private String toString(BSTNode<T> root) { if (root != null) { return toString(root.left) + root.data + toString(root.right); } else { return ""; } } public override string ToString() { return toString(mRoot); } public IEnumerator<T> GetEnumerator() { return traverseTree(mRoot).GetEnumerator(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { return GetEnumerator(); } } }