class App
{
public App()
{
Tree bt = new Tree();
Node root = bt.AddChild(bt.Root, "A", "A"); // (Node root, string target, string data)
bt.AddChild(root, "A", "B");
bt.AddChild(root, "A", "C");
bt.AddChild(root, "A", "D");
bt.AddChild(root, "B", "E");
bt.AddChild(root, "C", "F");
bt.AddChild(root, "D", "G");
bt.AddChild(root, "D", "H");
bt.AddChild(root, "D", "I");
bt.AddChild(root, "H", "J");
bt.AddChild(root, "I", "K");
bt.AddChild(root, "I", "L");
bt.AddChild(root, "L", "M");
bt.LevelOrder(root);
}
}
class Tree
{
public class Node
{
public string Data { get; private set; }
public List<Node> Next = new List<Node>();
public Node(string data)
{
Data = data;
}
}
public Node Root { get; private set; }
public void LevelOrder(Node root)
{
Queue<List<Node>> levelOrder = new Queue<List<Node>>();
int level = 1;
int queueCount = 0;
if (root == null) return;
Console.WriteLine("level {0}: {1}", level, root.Data);
Console.WriteLine();
levelOrder.Enqueue(root.Next);
List<Node> node = levelOrder.Dequeue();
level = 2;
while (true)
{
if (queueCount != 0)
{
node = levelOrder.Dequeue();
queueCount--;
}
for (int i = 0; i < node.Count; i++)
{
Console.WriteLine("level {0}: {1}", level, node[i].Data);
if (node[i].Next.Count != 0)
{
levelOrder.Enqueue(node[i].Next);
}
}
if (queueCount == 0)
{
queueCount = levelOrder.Count;
level++;
}
Console.WriteLine();
if (levelOrder.Count == 0) return;
}
}
public Node AddChild(Node root, string target, string data)
{
if (root == null)
{
return new Node(data);
}
else if (root.Data == target)
{
root.Next.Add(new Node(data));
}
else
{
Queue<List<Node>> nextQueue = new Queue<List<Node>>();
List<Node> next = root.Next;
while (true)
{
if (nextQueue.Count != 0) next = nextQueue.Dequeue();
for (int i = 0; i < next.Count; i++)
{
if (next[i].Data == target)
{
next[i].Next.Add(new Node(data));
return root;
}
else if (next[i].Next.Count != 0)
{
nextQueue.Enqueue(next[i].Next);
}
}
if (nextQueue.Count == 0) return root;
}
}
return root;
}
}