LeetCode-二叉树的层次遍历
给定一个二叉树,返回其按层次遍历的节点值。 (即逐层地,从左到右访问所有节点)。
例如:
给定二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
分析:这道题不同于普通的层次遍历,普通层次遍历只需要定义一个队列(Qeue)即可,然后依次将各个层的节点添加,遍历,而这道题需要把每层的节点分开储存,然后添加到总的list列表中,这就需要,额外添加一个队列,用来储存下一层的节点,区分本层节点,当本层节点遍历完成后,就可以将遍历结果添加到总的list列表中,然后再遍历下一层,实现代码如下
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
// leetcode:二叉树的层次遍历
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
// 作为返回结果
List<List<Integer>> res = new LinkedList<>();
// 如果根节点为null,则直接返回
if (root == null) {
return res;
}
// 声明每层的list集合为layer
List<Integer> layer = new LinkedList<>();
// 定义队列queue记录当前层的树节点
Queue<TreeNode> queue = new LinkedList<>();
// 定义队列nextQueue记录下一层的树节点
Queue<TreeNode> nextQueue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.remove();
layer.add(node.val);
// 将本层的父子节点都添加到下一层的queue中,用于下一层的遍历
if(node.left != null) {
nextQueue.add(node.left);
}
if(node.right != null) {
nextQueue.add(node.right);
}
//本层遍历结束
if(queue.isEmpty()) {
Queue<TreeNode> temp = new LinkedList<>();
// 此时queue大小已经为0,所以temp也为null
temp = queue;
// 即将遍历下一层
queue = nextQueue;
// 将nextQueue大小置为0
nextQueue = temp;
// 将本层的遍历结果layer添加到总list集合res中
res.add(layer);
layer = new LinkedList<>();
}
}
return res;
}
}