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); }
/* * source code from the blog: * http://bangbingsyb.blogspot.ca/2014/11/leetcode-binary-tree-level-order.html * comment from blog: * 这两题实际是一回事,考察的都是树的层序访问。无非就是在I得到结果后做一次reverse就能得到 * II要求的结果。无论是树还是图,层序访问最直接的方法就是BFS。 1. BFS可以用一个queue实现,但是难以跟踪每个节点究竟是在第几层。解决办法是除了压入节点 指针外,还同时压入节点所在的层数,即压入pair<TreeNode*, int>。 * Julia's comment: * 1. convert C++ code to C# code * 2. 单个queue的迭代解法 - using queue, iteratively solution * 3. 在压入root后,需要额外压入一个NULL来标记第i层尾, 最后一层不用. */ public static IList<IList<int>> levelOrder(TreeNode root) { IList<IList<int>> levelNodeValues = new List<IList<int>>(); if (root == null) return levelNodeValues; Queue<TreeNode> q = new Queue<TreeNode>(); q.Enqueue(root); q.Enqueue(null); int curLevel = 0; while (q.Count >0) { TreeNode cur = q.Peek(); q.Dequeue(); if (cur == null) { curLevel++; if (q.Count > 0) // ensure the checking, avoid dead loop q.Enqueue(null); } else { if (curLevel == levelNodeValues.Count) levelNodeValues.Add(new List<int>()); levelNodeValues[curLevel].Add(cur.val); if (cur.left != null) q.Enqueue(cur.left); if (cur.right != null) q.Enqueue(cur.right); } } return levelNodeValues; }
public TreeNode(int x) { val = x; left = null; right = null; }