using System; using System.Collections.Generic; public class Test { public static void Main() { var root = new TreeNode(8, "Value-8"); root.Left = new TreeNode(4, "Value-4"); root.Left.Left = new TreeNode(2, "Value-2"); root.Left.Left.Left = new TreeNode(1, "Value-1"); root.Left.Left.Right = new TreeNode(3, "Value-3"); root.Left.Right = new TreeNode(6, "Value-6"); root.Left.Right.Left = new TreeNode(5, "Value-5"); root.Left.Right.Right = new TreeNode(7, "Value-7"); root.Right = new TreeNode(12, "Value-12"); root.Right.Left = new TreeNode(10, "Value-10"); root.Right.Left.Left = new TreeNode(9, "Value-9"); root.Right.Left.Right = new TreeNode(11, "Value-11"); root.Right.Right = new TreeNode(14, "Value-14"); root.Right.Right.Left = new TreeNode(13, "Value-13"); root.Right.Right.Right = new TreeNode(15, "Value-15"); foreach (var item in root.TraverseLevelOrder()) Console.WriteLine(item.Value); } } public class TreeNode { public TreeNode(TKey key, TValue value) { this.Key = key; this.Value = value; } public TKey Key { get; private set; } public TValue Value { get; set; } public TreeNode Left { get; set; } public TreeNode Right { get; set; } public IEnumerable> TraverseInOrder() { if (this.Left != null) foreach (var item in this.Left.TraverseInOrder()) yield return item; yield return this; if (this.Right != null) foreach (var item in this.Right.TraverseInOrder()) yield return item; } public IEnumerable> TraverseLevelOrder() { var queue = new Queue>(); queue.Enqueue(this); while (queue.Count > 0) { var node = queue.Dequeue(); yield return node; if (node.Left != null) queue.Enqueue(node.Left); if (node.Right != null) queue.Enqueue(node.Right); } } }