using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class Tree : IEnumerable where TItem : IComparable {
public Tree(TItem nodeValue) {
this.NodeData = nodeValue;
this.LeftTree = null;
this.RightTree = null;
}
public void Insert(TItem newItem) {
TItem currentNodeValue = this.NodeData;
if (currentNodeValue.CompareTo(newItem) > 0) {
if (this.LeftTree == null) {
this.LeftTree = new Tree(newItem);
} else {
this.LeftTree.Insert(newItem);
}
} else {
if (this.RightTree == null) {
this.RightTree = new Tree(newItem);
} else {
this.RightTree.Insert(newItem);
}
}
}
public void WalkTree() {
if (this.LeftTree != null) {
this.LeftTree.WalkTree();
}
Console.WriteLine(this.NodeData.ToString());
if (this.RightTree != null) {
this.RightTree.WalkTree();
}
}
public TItem NodeData { get; set; }
public Tree LeftTree { get; set; }
public Tree RightTree { get; set; }
IEnumerator IEnumerable.GetEnumerator() {
return new TreeEnumerator(this);
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() {
throw new NotImplementedException();
}
}
class TreeEnumerator : IEnumerator where T : IComparable {
public TreeEnumerator(Tree data) {
this.currentData = data;
}
private void populate(Queue enumQueue, Tree tree) {
if (tree.LeftTree != null) {
populate(enumQueue, tree.LeftTree);
}
enumQueue.Enqueue(tree.NodeData);
if (tree.RightTree != null) {
populate(enumQueue, tree.RightTree);
}
}
private Tree currentData = null;
private T currentItem = default(T);
private Queue enumData = null;
T IEnumerator.Current {
get {
if (this.enumData == null)
throw new InvalidOperationException("Use MoveNext before calling Current");
return this.currentItem;
}
}
void IDisposable.Dispose() {
// throw new NotImplementedException();
}
object System.Collections.IEnumerator.Current {
get { throw new NotImplementedException(); }
}
bool System.Collections.IEnumerator.MoveNext() {
if (this.enumData == null) {
this.enumData = new Queue();
populate(this.enumData, this.currentData);
}
if (this.enumData.Count > 0) {
this.currentItem = this.enumData.Dequeue();
return true;
}
return false;
}
void System.Collections.IEnumerator.Reset() {
throw new NotImplementedException();
}
}
class Program {
static void Main(string[] args) {
Tree tree1 = new Tree(10);
tree1.Insert(5);
tree1.Insert(11);
tree1.Insert(5);
tree1.Insert(-12);
tree1.Insert(15);
tree1.Insert(0);
tree1.Insert(14);
tree1.Insert(-8);
tree1.Insert(10);
foreach (int item in tree1)
Console.WriteLine(item);
}
}