剑指offer32-Ⅲ 从上到下打印二叉树Ⅲ

题目描述

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

例如:
给定二叉树: [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]
]

提示:

  1. 节点总数 <= 1000

解题思路

方法一:队列、广度优先搜索

方法二:递归

代码实现

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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Solution {
/**
* 递归
*/
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new LinkedList<>();
level(res, root, 0);
return res;
}

private void level(List<List<Integer>> res, TreeNode root, int level) {
if (root == null) {
return;
}
if (level >= res.size()) {
res.add(new LinkedList<>());
}
if ((level & 1) == 0) {
res.get(level).add(root.val);
} else {
res.get(level).add(0, root.val);
}
level(res, root.left, level + 1);
level(res, root.right, level + 1);
}

/**
* 队列 迭代
* <p>
* 多种方式,可以进行,只需对奇偶层逻辑进行处理后,对加入链表队列的方式有所不同就能达到目的效果
*/
public List<List<Integer>> levelOrder2(TreeNode root) {
List<List<Integer>> res = new ArrayList<List<Integer>>();
if (root == null) {
return res;
}
Queue<TreeNode> queue = new LinkedList<>();
int level = 1;
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
List<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);
}
}
if (level % 2 == 0) { //反转链表
Collections.reverse(list);
}
res.add(list);
level++;
}
return res;
}
}

资料

https://leetcode-cn.com/problems/cong-shang-dao-xia-da-yin-er-cha-shu-iii-lcof/

Author

John Doe

Posted on

2021-05-28

Updated on

2021-06-13

Licensed under

You need to set install_url to use ShareThis. Please set it in _config.yml.
You forgot to set the business or currency_code for Paypal. Please set it in _config.yml.

Comments

You forgot to set the shortname for Disqus. Please set it in _config.yml.