Given a binary tree, return the level order traversal of its nodes' values. (ie, from left to right, level by level).
For example:
Given binary tree [3,9,20,null,null,15,7]
,
3 / \ 9 20 / \ 15 7
return its level order traversal as:
[ [3], [9,20], [15,7] ]
Subscribe to see which companies asked this question
此题的思路:用两个队列分别保存当前行和下一行的所有结点,遍历每一层的结点,都把结点放入到 nodeValues 中,当前层遍历结束,将当前层的nodeValues 存入 al 里,知道所有层都遍历结束,返回 al。
代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public List< List< Integer > > levelOrder( TreeNode root ) {
ArrayList < List< Integer > > al = new ArrayList < List< Integer > >(); //存储所有层上的结点值
ArrayList < Integer > nodeValues = new ArrayList < Integer >(); //存储每一层上的所有结点值
if( root == null )
return al;
//创建两个队列,一个保存当前层的所有结点,另外一个保存下一层的所有结点
LinkedList < TreeNode > current = new LinkedList < TreeNode >(); //存储当前层的结点
LinkedList < TreeNode > next = new LinkedList < TreeNode >(); //存储下一层的结点
current.add( root );
while( !current.isEmpty() ){
TreeNode node = current.remove(); //一处队列中第一个元素
if( node.left != null )
next.add ( node.left ); //把当前结点的左子结点放入到next中
if( node.right != null )
next.add( node.right ); //把当前结点的右子结点放入到next中
nodeValues.add( node.val ); //把当前结点放入到nodeValues中
if( current.isEmpty() ){ //当前层已经遍历完成
current = next; //往下移一层
next = new LinkedList < TreeNode >(); //重新创建next
al.add( nodeValues ); //将当前层的所有节点值放入到al中
nodeValues = new ArrayList <> (); //重新创建nodeValues
}
}
return al;
}
}