描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(第一层从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{1,2,3,#,#,4,5}
示例1
输入:
{1,2,3,#,#,4,5}
返回值:
[[1],[3,2],[4,5]]示例2
输入:
{8,6,10,5,7,9,11}
返回值:
[[8],[10,6],[5,7,9,11]]示例3
输入:
{1,2,3,4,5}
返回值:
[[1],[3,2],[4,5]]思路
按层遍历二叉树,不知道大家了不了解,按层便利就是将每层的元素,按照从左到右的顺序输出。而这道题要求的 之 字形便利,则是第一层是从左到右,下一层则是从右到左。如果之前会写按层遍历,在写这道题会相对简单一点。
以上面这棵树为例:
- 首先咱们通过 队列 这个数据结构来实现每层元素的存储,当遍历到第一层的时候,这时是从左到右的顺序入队列,入了队列之后值存入到集合中。然后再将左节点以及右节点入队。
- 这时到了第二层,这层的顺序是从右到左了,从队列中出队,弹出元素,将上一层所有的元素都弹出后,以相反的顺序存入到集合中。
- 之后重复上面的动作,知道完成便利。
AC代码
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<>();
if (pRoot == null) {
return result;
}
// 创建一个队列
Queue<TreeNode> queue = new LinkedList<>();
// 根节点先入队
queue.offer(pRoot);
// 当队列不为空时
while (!queue.isEmpty()) {
int size = queue.size();
ArrayList<Integer> list = new ArrayList<>();
// 仅遍历当前层的元素,因为结果是按照层的维度存储的
for (int i = 0; i < size; i ++) {
// 弹出元素
TreeNode node = queue.poll();
list.add(node.val);
// 如果左节点不为空,则入队
if (node.left != null) {
queue.offer(node.left);
}
// 如果右节点不为空,则入队
if (node.right != null) {
queue.offer(node.right);
}
}
// 判断一下是否为奇数层,如果是,则将结果反着存储,
// 这里将根节点那层设定为 第 0 层,为偶数层
if (result.size() % 2 == 1) {
Collections.reverse(list);
}
// 将结果以 层 为维度存储
result.add(list);
}
return result;
} 时间复杂度:O(N), N 为节点数,每个节点都要遍历一次
空间复杂度:o(N), N 为节点数,将这些节点存入到队列中
最后
做这道题之前最后先做一下 层序遍历二叉树,这道题只不过是变了一下而已。
大家可以去 【牛客网-题库-在线编程】去练习一下。
可以去微信搜索:【蘑菇睡不着】交个朋友~
也可以扫描下方二维码。

京公网安备 11010502036488号