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

    }
}