给你一个二叉树,请你返回其按层序遍历得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:二叉树:[3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层序遍历结果:
[
[3],
[9,20],
[15,7]
]
解法一 BFS
思路:
大while循环里套一个小while循环,大while循环控制层数,小while循环控制每一层元素的遍历
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null){
return result;
}
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
//当q里有元素的时候进入循环
//每一次进入这个循环的时候就会开启一个新的层级
while (q.size()>0){
//q里元素的个数
int size = q.size();
//这个list存每一层上有多少个元素
ArrayList<Integer> list = new ArrayList<>();
//当前层所有元素的循环
while (size > 0){
TreeNode cur = q.poll();
list.add(cur.val);
//看看左子树有没有元素,有的话加到下一层q
if (cur.left != null){
q.add(cur.left);
}
//看看左子树有没有元素,有的话加到下一层q
if (cur.right != null){
q.add(cur.right);
}
//控制while循环的指针
size--;
}
result.add(new ArrayList<>(list));
}
return null;
}
解法一 DFS
这道题考的就是 BFS,我们可以通过 DFS 实现。只需要在递归过程中将当前 level 传入即可.
public List<List<Integer>> levelOrder2(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
if (root == null){
return result;
}
dfs(root,result,0);
return result;
}
private void dfs(TreeNode node, List<List<Integer>> result, int level) {
if (node == null){
return;
}
//当前层数还没有元素,先new一个空的列表
if(level > result.size()-1){
result.add(new ArrayList<>());
}
//当前值加入
result.get(level).add(node.val);
//这里不用判断左右子树是否为空
//会在下一层的dfs里判断
dfs(node.left,result,level+1);
dfs(node.right,result,level+1);
}