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();
}
}
}