using System.Collections.Generic;
public static void Main()
var tree = new Tree<string>()
tree.Nodes.ForEach(p => PrintNode(p, 0));
static void PrintNode<T>(TreeNode<T> node, int level)
Console.WriteLine("{0}{1}", new string(' ', level*3), node.Value);
node.Children.ForEach(p => PrintNode(p, level));
public TreeNode<T> Parent {get;}
public List<TreeNode<T>> Children {get; }
public TreeNode(T val, TreeNode<T> parent)
Children = new List<TreeNode<T>>();
public TreeNode<T> Add(T val)
var node = new TreeNode<T>(val,this);
private Stack<TreeNode<T>> m_Stack = new Stack<TreeNode<T>>();
public List<TreeNode<T>> Nodes{get;} = new List<TreeNode<T>>();
public Tree<T> Begin(T val)
var node = new TreeNode<T>(val, null);
var node = m_Stack.Peek().Add(val);
public Tree<T> Add(T val)