问题描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例
二叉树:[3,9,20,null,null,15,7]
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
思路
DFS和BFS都可以做到。 但是BFS为佳。这题就是为BFS而生的。
BFS(方法一)
DFS(方法二)
DFS是怎么做的呢? 我们可以控制先遍历左子树再遍历右子树。所以我们可以在每到一个新层,都创建一个ArrayList。
方法一
Java版
import java.util.*;
public class Main{
public static void main(String[] args){
}
}
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();// 存储结果
Queue<TreeNode> queue = new LinkedList<>(); // 层序遍历
if(root == null) return res;
queue.add(root);
while(!queue.isEmpty()){
Queue<TreeNode> next = new LinkedList<>(); // 下一次的queue
List<Integer> tmp = new ArrayList<>(); // 待加入结果的arrayList
while(!queue.isEmpty()){
TreeNode tmpNode = queue.poll();
tmp.add(tmpNode.val);
if(tmpNode.left != null) next.add(tmpNode.left);
if(tmpNode.right != null) next.add(tmpNode.right);
}
res.add(tmp);
queue = next; // 更新
}
return res;
}
}
方法二
Java版
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if(root == null) return res;
DFS(res,root,0);
return res;
}
private void DFS(List<List<Integer>> res,TreeNode root, int depth){
if(depth == res.size()){
res.add(new ArrayList<>());
}
res.get(depth).add(root.val);
if(root.left != null) DFS(res,root.left,depth+1);
if(root.right != null) DFS(res,root.right, depth+1);
}
}