using System;
using System.Collections.Generic;
public class Test
{
public static void Main()
{
var root = new TreeNode<int, string>(8, "Value-8");
root.Left = new TreeNode<int, string>(4, "Value-4");
root.Left.Left = new TreeNode<int, string>(2, "Value-2");
root.Left.Left.Left = new TreeNode<int, string>(1, "Value-1");
root.Left.Left.Right = new TreeNode<int, string>(3, "Value-3");
root.Left.Right = new TreeNode<int, string>(6, "Value-6");
root.Left.Right.Left = new TreeNode<int, string>(5, "Value-5");
root.Left.Right.Right = new TreeNode<int, string>(7, "Value-7");
root.Right = new TreeNode<int, string>(12, "Value-12");
root.Right.Left = new TreeNode<int, string>(10, "Value-10");
root.Right.Left.Left = new TreeNode<int, string>(9, "Value-9");
root.Right.Left.Right = new TreeNode<int, string>(11, "Value-11");
root.Right.Right = new TreeNode<int, string>(14, "Value-14");
root.Right.Right.Left = new TreeNode<int, string>(13, "Value-13");
root.Right.Right.Right = new TreeNode<int, string>(15, "Value-15");
foreach (var item in root.TraverseLevelOrder())
Console.WriteLine(item.Value);
}
}
public class TreeNode<TKey, TValue>
{
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<TKey, TValue> Left { get; set; }
public TreeNode<TKey, TValue> Right { get; set; }
public IEnumerable<TreeNode<TKey, TValue>> 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<TreeNode<TKey, TValue>> TraverseLevelOrder()
{
var queue = new Queue<TreeNode<TKey, TValue>>();
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);
}
}
}
dXNpbmcgU3lzdGVtOwp1c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKCnB1YmxpYyBjbGFzcyBUZXN0CnsKCXB1YmxpYyBzdGF0aWMgdm9pZCBNYWluKCkKCXsKCQl2YXIgcm9vdCA9IG5ldyBUcmVlTm9kZTxpbnQsIHN0cmluZz4oOCwgIlZhbHVlLTgiKTsKCQlyb290LkxlZnQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDQsICJWYWx1ZS00Iik7CgkJcm9vdC5MZWZ0LkxlZnQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDIsICJWYWx1ZS0yIik7CgkJcm9vdC5MZWZ0LkxlZnQuTGVmdCA9IG5ldyBUcmVlTm9kZTxpbnQsIHN0cmluZz4oMSwgIlZhbHVlLTEiKTsKCQlyb290LkxlZnQuTGVmdC5SaWdodCA9IG5ldyBUcmVlTm9kZTxpbnQsIHN0cmluZz4oMywgIlZhbHVlLTMiKTsKCQlyb290LkxlZnQuUmlnaHQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDYsICJWYWx1ZS02Iik7CgkJcm9vdC5MZWZ0LlJpZ2h0LkxlZnQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDUsICJWYWx1ZS01Iik7CgkJcm9vdC5MZWZ0LlJpZ2h0LlJpZ2h0ID0gbmV3IFRyZWVOb2RlPGludCwgc3RyaW5nPig3LCAiVmFsdWUtNyIpOwoJCXJvb3QuUmlnaHQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDEyLCAiVmFsdWUtMTIiKTsKCQlyb290LlJpZ2h0LkxlZnQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDEwLCAiVmFsdWUtMTAiKTsKCQlyb290LlJpZ2h0LkxlZnQuTGVmdCA9IG5ldyBUcmVlTm9kZTxpbnQsIHN0cmluZz4oOSwgIlZhbHVlLTkiKTsKCQlyb290LlJpZ2h0LkxlZnQuUmlnaHQgPSBuZXcgVHJlZU5vZGU8aW50LCBzdHJpbmc+KDExLCAiVmFsdWUtMTEiKTsKCQlyb290LlJpZ2h0LlJpZ2h0ID0gbmV3IFRyZWVOb2RlPGludCwgc3RyaW5nPigxNCwgIlZhbHVlLTE0Iik7CgkJcm9vdC5SaWdodC5SaWdodC5MZWZ0ID0gbmV3IFRyZWVOb2RlPGludCwgc3RyaW5nPigxMywgIlZhbHVlLTEzIik7CgkJcm9vdC5SaWdodC5SaWdodC5SaWdodCA9IG5ldyBUcmVlTm9kZTxpbnQsIHN0cmluZz4oMTUsICJWYWx1ZS0xNSIpOwoJCQoJCWZvcmVhY2ggKHZhciBpdGVtIGluIHJvb3QuVHJhdmVyc2VMZXZlbE9yZGVyKCkpCgkJCUNvbnNvbGUuV3JpdGVMaW5lKGl0ZW0uVmFsdWUpOwoJfQoJCgkKfQoKcHVibGljIGNsYXNzIFRyZWVOb2RlPFRLZXksIFRWYWx1ZT4KewoJcHVibGljIFRyZWVOb2RlKFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpCgl7CgkJdGhpcy5LZXkgPSBrZXk7CgkJdGhpcy5WYWx1ZSA9IHZhbHVlOwoJfQoJCglwdWJsaWMgVEtleSBLZXkgeyBnZXQ7IHByaXZhdGUgc2V0OyB9CgkKCXB1YmxpYyBUVmFsdWUgVmFsdWUgeyBnZXQ7IHNldDsgfQoJCglwdWJsaWMgVHJlZU5vZGU8VEtleSwgVFZhbHVlPiBMZWZ0IHsgZ2V0OyBzZXQ7IH0KCQoJcHVibGljIFRyZWVOb2RlPFRLZXksIFRWYWx1ZT4gUmlnaHQgeyBnZXQ7IHNldDsgfQoJCglwdWJsaWMgSUVudW1lcmFibGU8VHJlZU5vZGU8VEtleSwgVFZhbHVlPj4gVHJhdmVyc2VJbk9yZGVyKCkKCXsKCQlpZiAodGhpcy5MZWZ0ICE9IG51bGwpCgkJCWZvcmVhY2ggKHZhciBpdGVtIGluIHRoaXMuTGVmdC5UcmF2ZXJzZUluT3JkZXIoKSkKCQkJCXlpZWxkIHJldHVybiBpdGVtOwoJCQkJCgkJeWllbGQgcmV0dXJuIHRoaXM7CgkJCgkJaWYgKHRoaXMuUmlnaHQgIT0gbnVsbCkKCQkJZm9yZWFjaCAodmFyIGl0ZW0gaW4gdGhpcy5SaWdodC5UcmF2ZXJzZUluT3JkZXIoKSkKCQkJCXlpZWxkIHJldHVybiBpdGVtOwoJfQoJCglwdWJsaWMgSUVudW1lcmFibGU8VHJlZU5vZGU8VEtleSwgVFZhbHVlPj4gVHJhdmVyc2VMZXZlbE9yZGVyKCkKCXsKCQl2YXIgcXVldWUgPSBuZXcgUXVldWU8VHJlZU5vZGU8VEtleSwgVFZhbHVlPj4oKTsKCQlxdWV1ZS5FbnF1ZXVlKHRoaXMpOwoJCQoJCXdoaWxlIChxdWV1ZS5Db3VudCA+IDApCgkJewoJCQl2YXIgbm9kZSA9IHF1ZXVlLkRlcXVldWUoKTsKCQkJeWllbGQgcmV0dXJuIG5vZGU7CgkJCQoJCQlpZiAobm9kZS5MZWZ0ICE9IG51bGwpCgkJCQlxdWV1ZS5FbnF1ZXVlKG5vZGUuTGVmdCk7CgkJCQkKCQkJaWYgKG5vZGUuUmlnaHQgIT0gbnVsbCkKCQkJCXF1ZXVlLkVucXVldWUobm9kZS5SaWdodCk7CgkJfQoJfQp9