/*
         * source code from blog:
         * http://fisherlei.blogspot.ca/2013/01/leetcode-binary-tree-level-order.html
         *
         * convert from C++ to C#
         * Julia's commment:
         *  1. It is DFS algorithm
         */
        public static IList<IList<int>> levelOrder(TreeNode root)
        {
            IList<IList<int>> output = new List<IList<int>>();

            if(root == null )
                return output;

            IList<int> oneLine = new List<int>();

            int     currentLevel  = 1;
            bool    hasNextLevel  = true;

            while(hasNextLevel)
            {
                hasNextLevel = false;

                levelTravel(root, currentLevel, ref hasNextLevel, oneLine);

                List<int> l = new List<int>();
                l.AddRange(oneLine);
                output.Add(l);

                oneLine.Clear();

                currentLevel++;
            }

            return output;
        }
        static void Main(string[] args)
        {
            /*Latest update: July 23, 2015
            * Test the code
            */
            TreeNode n1 = new TreeNode(1);
            n1.left = new TreeNode(2);
            n1.right = new TreeNode(3);
            n1.left.left = new TreeNode(4);
            n1.left.right = new TreeNode(5);
            n1.right.left = new TreeNode(6);
            n1.right.right = new TreeNode(7);

            IList<IList<int>> result3 = levelOrder(n1);
        }
        public static void levelTravel(  
            TreeNode node,   
            int level,  
            ref bool hasNextLevel,  
            IList<int> result)
        {
            if(node == null) return;

            if(level == 1)
            {
                result.Add(node.val);

                if(node.left !=null || node.right !=null)
                    hasNextLevel = true;
                return;
            }
            else
            {
                levelTravel(node.left, level-1, ref hasNextLevel, result);
                levelTravel(node.right, level-1, ref hasNextLevel, result);
            }
        }
 public TreeNode(int x)
 {
     val = x;
     left = null;
     right = null;
 }