using System.Collections.Generic;
public static void PrintLinkedList<T>(LinkedListNode<T> node){
Console.Write(node.Value + " ");
public class TreeNode<T>{
public T Data {get; set;}
public TreeNode<T> Left {get; set;}
public TreeNode<T> Right {get; set;}
public void PrintPretty(string indent="", bool last=true){
if (Left == null && Right == null) return;
Left.PrintPretty(indent, false);
Right.PrintPretty(indent, true);
public static TreeNode<int> CreateTestTree(){
var rootNode = new TreeNode<int>(1){
Left = new TreeNode<int>(2){
Left = new TreeNode<int>(4),
Right = new TreeNode<int>(5){
Left = new TreeNode<int>(8),
Right = new TreeNode<int>(9){
Left = new TreeNode<int>(11)
Right = new TreeNode<int>(3){
Left = new TreeNode<int>(6),
Right = new TreeNode<int>(7){
Left = new TreeNode<int>(10)
private static void CreateLinkedListsOfDepths<T>(TreeNode<T> node, int depth, List<LinkedList<T>> listOfDepths){
var newElement = new LinkedListNode<T>(node.Data);
LinkedList<T> depthList = null;
if (listOfDepths.Count>depth){
depthList = listOfDepths[depth];
depthList = new LinkedList<T>();
listOfDepths.Add(depthList);
depthList.AddLast(newElement);
CreateLinkedListsOfDepths<T>(node.Left, depth+1, listOfDepths);
CreateLinkedListsOfDepths<T>(node.Right, depth+1, listOfDepths);
public static List<LinkedList<T>> ListOfDepths<T>(TreeNode<T> root){
var listOfDepths = new List<LinkedList<T>>();
CreateLinkedListsOfDepths(root, depth, listOfDepths);
public static void Main()
Console.WriteLine("Hello World");
var root = CreateTestTree();
root.PrintPretty("",true);
var listOfDepths = ListOfDepths(root);
foreach (var element in listOfDepths){
Console.Write(depth + ": ");
PrintLinkedList(element.First);