1.题目描述
剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[20,9],
[15,7]
]
2.解题思路与代码
2.1 解题思路
题目要求同样是对二叉树进行层序遍历,并需要遵循奇数层从左到右,偶数层从右到左的顺序将每一层的列表放入结果列表中。按照前面文章的方式对二叉树进行层序遍历,遍历的同时记录放入列表的次数(layerCount)以及所便利的层数(layer)。当放入次数(layerCount)等于队列长度时,表示上一层已遍历完成,此时 layerCount 清零,并将这一层的结果放入结果列表中,需要注意当层数(layer)是奇数时直接放入即可,但是当层数是偶数时,使用双指针对这一层元素列表进行逆序,然后放入结果列表中。
2.2 代码
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> ans = new ArrayList<>();
if (root == null) {
return ans;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
List<Integer> tmp = new ArrayList<>();
tmp.add(root.val);
// 统计放入队列次数
int layerCount = 1;
// 统计层数
int layer = 1;
while (!queue.isEmpty()) {
if (layerCount == queue.size()) {
// 放入队列次数等于队列长度时遍历完上一层
if (layer % 2 == 0) {
// 当层数是偶数时,使用双指针逆序 tmp 列表
int L = 0;
int R = tmp.size() - 1;
while (L < R) {
int left = tmp.get(L);
tmp.set(L, tmp.get(R));
tmp.set(R, left);
L++;
R--;
}
}
// tmp 列表放入结果列表中
ans.add(tmp);
tmp = new ArrayList<>();
// layerCount 清零,层数加一
layerCount = 0;
layer++;
}
TreeNode poll = queue.poll();
if (poll.left != null) {
queue.offer(poll.left);
tmp.add(poll.left.val);
layerCount++;
}
if (poll.right != null) {
queue.offer(poll.right);
tmp.add(poll.right.val);
layerCount++;
}
}
return ans;
}
}
2.3 测试结果
通过测试
3.总结
- 当放入队列次数等于对量长度时,上一层遍历完成,此时需要记录遍历层数
- 当层数为奇数时,直接放入结果列表中;为偶数时需要逆序节点后,再放入结果列表