从上到下打印二叉树 III

题目描述

请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。

例如:
给定二叉树: [3,9,20,null,null,15,7],

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

1
2
3
4
5
[
[3],
[20,9],
[15,7]
]

提示:
节点总数 <= 1000

题目链接

Leetcode

题目解答

解法一

层序遍历+倒序,题目要求偶数层的元素打印顺序为从右到左,也就是逆序打印,比较容易想到的方式是先按正常从左到右的顺访问元素,把一层的元素都添加到集合后,判断是否为偶数层,如果是就先把集合中的元素反转,然后把集合添加到结果集,如果不是则直接把集合添加到结果集。

时间复杂度:$O(n)$ 空间复杂度:$O(n)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
if (root != null) queue.add(root);
while (!queue.isEmpty()) {
ArrayList<Integer> level = new ArrayList<>();
for (int i = queue.size(); i > 0; i--) {
TreeNode node = queue.poll();
level.add(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
// 偶数层需要反转集合元素
if ((result.size() + 1) % 2 == 0) Collections.reverse(level);
result.add(level);
}
return result;
}
}

执行用时:1 ms, 在所有 Java 提交中击败了99.41%的用户
内存消耗:38.5 MB, 在所有 Java 提交中击败了68.74%的用户

解法二

层序遍历+双端队列,整体思路和方法一类似,借助双端队列我们可以通过在每一层选择从队首或队尾添加元素的方式,很自然的得到元素逆序或正序的访问集合,然后把集合添加到结果集即可。

时间复杂度:$O(n)$ 空间复杂度:$O(n)$

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
if (root != null) queue.add(root);
while (!queue.isEmpty()) {
LinkedList<Integer> deque = new LinkedList<>();
for (int i = queue.size(); i > 0; i--) {
TreeNode node = queue.poll();
// 偶数层元素从双端队列队首加入
if ((result.size() + 1) % 2 == 0) deque.addFirst(node.val);
// 奇数层元素从双端队列队尾加入
else deque.addLast(node.val);
if (node.left != null) queue.add(node.left);
if (node.right != null) queue.add(node.right);
}
result.add(deque);
}
return result;
}
}

执行用时:1 ms, 在所有 Java 提交中击败了99.41%的用户
内存消耗:38.7 MB, 在所有 Java 提交中击败了22.91%的用户

-------------本文结束 感谢您的阅读-------------

文章对您有帮助,可以打赏一杯咖啡,鼓励我继续创作!