102.二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
乍一看挺复杂,仔细做一下,一招秒。
package com.programmercarl.tree;
import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;
/**
* @ClassName LevelOrder
* @Descriotion TODO
* @Author nitaotao
* @Date 2022/7/3 11:55
* @Version 1.0
* https://leetcode.cn/problems/binary-tree-level-order-traversal/
* 102. 二叉树的层序遍历
**/
public class LevelOrder {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<List<Integer>>();
Deque<TreeNode> deque = new ArrayDeque();
if (root == null) {
return result;
}
//入队
deque.offer(root);
while (!deque.isEmpty()) {
int size=deque.size();
List<Integer> floor = new ArrayList();
while (size > 0) {
//每次遍历一层
TreeNode node = deque.poll();
floor.add(node.val);
if (node.left != null) {
deque.offer(node.left);
}
if (node.right != null) {
deque.offer(node.right);
}
size--;
}
result.add(floor);
}
return result;
}
}
层序遍历,大 list
包小 list 。 每个小 list 为一层。
一层一层来,记录当前队列的长度,就是上一层有多少元素,这次就弹出多少次,把新元素继续加在队列尾部即可。
看了一下题解,我的属于广度优先遍历,还有深度优先遍历。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//里面的list是每层的元素
List<List<Integer>> result = new ArrayList<List<Integer>>();
checkFun01(root, 0, result);
return result;
}
private void checkFun01(TreeNode root, int deep, List<List<Integer>> result) {
if (root == null) {
return;
}
//深度增加
deep++;
if (result.size() < deep) {
//如果出现了新的一层
result.add(new ArrayList<>());
}
//本层元素加入本层列表
result.get(deep - 1).add(root.val);
checkFun01(root.left, deep, result);
checkFun01(root.right, deep, result);
}
}
按层级来,每层一个 List ,各层元素对应放置。