题目:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/
代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
if (root == null) {
return res;
}
//定义一个队列来存储每一层的数据
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
//处理第n层
List<Integer> level = new ArrayList<>();
//第n层数据个数,即需要处理的个数
int currentLevelSize = queue.size();
for (int i = 0; i < currentLevelSize; i++) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
res.add(level);
}
return res;
}
}
使用二叉树BFS广度优先搜索实现,其实层序遍历就是广度优先搜索,参考:二叉树DFS深度优先搜索和BFS广度优先搜索区别动图
思路:利用队列先进先出的原理,遍历每一层的节点,在遍历时将下一层的节点存到队列中,通过记录每一层队列的数量来实现分层。具体实现逻辑参考代码。
使用二叉树DFS深度优先搜索实现的版本:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
this.handle(root, res, 0);
return res;
}
private void handle(TreeNode node, List<List<Integer>> res, int level) {
if (node == null) {
return;
}
if (res.size() <= level) {
//新的一层
res.add(new ArrayList<>());
}
//获取当前层的list
List<Integer> list = res.get(level);
list.add(node.val);
//递归调用子节点
this.handle(node.left, res, level + 1);
this.handle(node.right, res, level + 1);
}
}
通过平台测试,DFS方式还更快1秒。实现思路:通过传参的形式,将层级这一信息进行传递,其他的就是遍历,没有什么区别。