剑指 Offer 32 - III. 从上到下打印二叉树 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]
]

提示:

  1. $节点总数 <= 1000$

算法

(BFS,层序遍历) $O(n)$

剑指 Offer 32 - II. 从上到下打印二叉树 II 层序遍历的思路一样,只需要通过一个 $bool$ 变量在每行遍历结束之后翻转下一行的顺序即可。

时间复杂度

$O(n)$

空间复杂度

$O(n)$

C++ 代码

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
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
queue<TreeNode*> q;

if (root) q.push(root);

bool zigzag = false;
while (q.size()) {
int sz = q.size();
vector<int> line;
while (sz -- ) {
auto t = q.front();
q.pop();

line.push_back(t->val);
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
if (zigzag) reverse(line.begin(), line.end());
ans.push_back(line);
zigzag = !zigzag;
}

return ans;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/08/剑指 Offer/剑指 Offer 32 - III. 从上到下打印二叉树 III/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.