题目
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
返回其层次遍历结果:
注意点
参考1:二叉树的层序遍历(BFS实现)
参考2:二叉树的层次遍历Ⅱ(BFS实现)
1、该题是以上两道题的综合,根据不同情况采取不同的操作;
- 向左遍历,使用尾插法;
- 向右遍历,使用头插法。
实现
public List<List<Integer>> zigzagLevelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
// 是否向左遍历(反向),默认为向右遍历
boolean orderLeft = false;
if (root == null) {
return result;
}
// 队列用于存放每一层的节点
Queue<TreeNode> queue = new ArrayDeque<>();
// 第一层只有根节点
queue.add(root);
//遍历二叉树
while (!queue.isEmpty()) {
// 每一层的结果
LinkedList<Integer> level = new LinkedList<>();
// 每一层节点数
int queueSize = queue.size();
//遍历每一层
for (int i = 0; i < queueSize; i ++) {
// 当前节点
TreeNode curNode = queue.poll();
// 当前节点值
int curNodeVal = curNode.val;
//判断遍历方向
if (orderLeft) {
// 向左遍历,使用尾插法
level.addFirst(curNodeVal);
} else {
// 向右遍历,使用头插法
level.addLast(curNodeVal);
}
// 判断是否存在左节点
if (curNode.left != null) {
queue.add(curNode.left);
}
// 判断是否存在右节点
if (curNode.right != null) {
queue.add(curNode.right);
}
}
result.add(level);
// 反向
orderLeft = !orderLeft;
}
return result;
}