using System;
using System.Collections.Generic;
using System.Collections;
namespace MyPractise.TreePractise
{
/// <summary>
/// Abstract node
/// </summary>
/// <typeparam name="T">Node instance</typeparam>
abstract class TreeNode<T> where T : TreeNode<T>
{
public T LeftNode { get; set; }
public T RightNode { get; set; }
}
/// <summary>
/// Tree class
/// </summary>
/// <typeparam name="T">Node instance</typeparam>
class Tree<T> where T : TreeNode<T>
{
/// <summary>
/// Root node
/// </summary>
public T RootNode { get; set; }
public IEnumerator GetEnumerator()
{
//Reserve nodes which have right node.
Stack<T> stack = new Stack<T>();
//Current node instance
T currentNode = RootNode;
//When current node was set as the last node's right node, exit the cycle
while(currentNode!=null)
{
//When current still has left node, add current node to stack and set current node as the his left node, do the cycle again
while (currentNode.LeftNode != null)
{
stack.Push(currentNode);
currentNode = currentNode.LeftNode;
}
//Add current node to stack
stack.Push(currentNode);
//Set current node as the output of the stack, output the node
do
{
if (stack.Count != 0)
{
currentNode = (T)stack.Pop();
yield return currentNode;
}
else
{
break;
}
}
//Do this cycle, until right node of current node was not empty
while (currentNode.RightNode == null);
//Set current node as the right node and go on the big cycle
currentNode = currentNode.RightNode;
}
}
}
}