Question
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]
]
本题难度Easy。有2种算法分别是: 递归法和迭代法
1、递归法
【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)
【思路】
本题实质是广度优先搜索BFS,而用队列可以轻松地实现它。不断地从队列q
中取出节点n
,将其值n.val
写入list
,再将n
的左右两个节点放入新的队列nextQ
中。完毕后,将list
放入结果ans
中,然后进行下一个层序遍历,直至到达 base case 条件。
【注意】
第15行和第31、32行都对节点是否为null进行了判断。
【代码】
/**
* 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) {
//require
List<List<Integer>> ans=new LinkedList<>();
Queue<TreeNode> q=new LinkedList<>();
if(root!=null)q.add(root);
//invariant
helper(q,ans);
//ensure
return ans;
}
private void helper(Queue<TreeNode> q,List<List<Integer>> ans){
//base case
if(q.isEmpty())
return;
List<Integer> list=new LinkedList<>();
Queue<TreeNode> nextQ=new LinkedList<>();
while(!q.isEmpty()){
TreeNode n=q.remove();
list.add(n.val);
if(n.left!=null)nextQ.add(n.left);
if(n.right!=null)nextQ.add(n.right);
}
ans.add(list);
helper(nextQ,ans);
}
}
2、迭代法
【复杂度】
时间 O(b^(h+1)-1) 空间 O(b^h)
【思路】
在递归法基础上改过来,不同点在于始终只使用一个队列q
,为了在队列中区分各层节点,利用q
的大小对20-25行的循环次数加以控制。
【代码】
/**
* 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) {
//require
List<List<Integer>> ans=new LinkedList<>();
Queue<TreeNode> q=new LinkedList<>();
if(root!=null)q.add(root);
//invariant
while(!q.isEmpty()){
List<Integer> list=new LinkedList<>();
int size=q.size();
for(int i=0;i<size;i++){
TreeNode n=q.remove();
list.add(n.val);
if(n.left!=null)q.add(n.left);
if(n.right!=null)q.add(n.right);
}
ans.add(list);
}
//ensure
return ans;
}
}