九章算法答案:http://www.jiuzhang.com/solutions/binary-tree-level-order-traversal/
思路:
Queue使用时要尽量避免Collection的add()和remove()方法
而是要使用offer()来加入元素,使用poll()来获取并移出元素。
它们的优点是通过返回值可以判断成功与否,add()和remove()方法在失败的时候会抛出异常
BFS思路,广度优先
C# code
public static IList<IList<int>> levelOrder(TreeNode root)
{
IList<IList<int>> result = new List<IList<int>>();
//边界条件
if (root == null)
return result;
//排除边界条件,把root加入queue中;
//在本算法中,queue作为循环判断的基础。需要处理的元素就放进queue,处理完了就丢弃;
//直到queue为空,就停止
//queue元素个数就是需要内部循环的次数;
Queue<TreeNode> queue = new Queue<TreeNode>();
queue.Enqueue(root);
while (queue.Count != 0)
{
List<int> levelList = new List<int>();
int size = queue.Count;
//取出queue中一个元素,添加到levelList中去;
//同时把这个取出元素的子元素添加到queue中;
for (int i = 0; i < size; i++)
{
//取出queue中一个元素,添加到levelList中去;
TreeNode head = queue.Dequeue();
levelList.Add(head.val);
//同时把这个取出元素的子元素添加到queue中;
if (head.left != null)
queue.Enqueue(head.left);
if (head.right != null)
queue.Enqueue(head.right);
}
result.Add(levelList);
}
return result;
}