力扣刷题-二叉树的层序遍历
二叉树的层序遍历分为两种
- 借助一个队列的迭代法
- DFS 递归法
1、迭代法
public List<List<Integer>> levelOrder(TreeNode root) {
//借助一个队列来实现层序遍历
List<List<Integer>> result = new ArrayList<List<Integer>>();
if (root == null){
return result;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.add(root);
while (!queue.isEmpty()){
List<Integer> itemList = new ArrayList<>();
int len = queue.size(); //用来记录每一行有多少个节点
while (len > 0){
TreeNode node = queue.poll();
itemList.add(node.val);
if (node.left != null){
queue.add(node.left);
}
if (node.right != null){
queue.add(node.right);
}
len--;
}
result.add(itemList);
}
return result;
}
2、递归法
DFS(深度优先遍历)
//递归法 dfs
public List<List<Integer>> levelOrder1(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 deep) {
//1、递归传入参数和返回值 传入需要处理的节点、结果集、处理的该节点所在的层数
//2、递归终止条件 node==null
//3、单层递归逻辑
// 如果递归的层数超过了result当前的大小(比如说现在只有[[],[]],但是现在层数是第2层(默认从0层开始 所以现在只有0 1层))
// 不可以从1层开始,会出现数组越界的异常
// 也就是说现在result中没有存放这一层的子数组 就创建一个
// 如果有了的话 就将该节点的数值存放进相应的子数组中 继续递归它的子节点
if (node == null) return;
if (result.size() -1 < deep){
List<Integer> item = new ArrayList<>();
result.add(item);
}
result.get(deep).add(node.val);
dfs(node.left,result,deep+1);
dfs(node.right,result,deep+1);
}