103. Binary Tree Zigzag Level Order Traversal
题目大意
Given the root of a binary tree, return the zigzag level order traversal of its nodes’ values. (i.e., from left to right, then right to left for the next level and alternate between).
中文释义
给定一个二叉树的根节点,返回其节点值的之字形层序遍历结果(即先从左到右,然后下一层从右到左,之后交替进行)。
示例
示例 1:
输入: root
= [3,9,20,null,null,15,7]
输出: [[3],[20,9],[15,7]]
示例 2:
输入: root
= [1]
输出: [[1]]
示例 3:
输入: root
= []
输出: []
限制条件
- 树中节点的数量范围是
[0, 2000]
。 -100 <= Node.val <= 100
解题思路
方法
该方法使用层次遍历(广度优先搜索)来遍历二叉树的每个节点,并在每一层交替改变遍历的方向。
-
处理空树的情况:
- 如果根节点为空,则返回空的结果列表。
-
使用队列进行层次遍历:
- 使用一个队列
node_queue
存储每层的节点。
- 使用一个队列
-
遍历每一层并收集节点值:
- 对于每一层的节点,从队列中取出并存储其值。
- 将这一层的节点值存储为一个列表。
-
交替反转列表:
- 使用一个标志
flag
来表示当前层的遍历方向。 - 如果
flag
为 -1,则反转当前层的节点值列表。
- 使用一个标志
-
添加子节点到队列:
- 将当前节点的左右子节点(如果存在)添加到队列中,以便下一轮遍历。
-
更新队列大小和方向标志:
- 更新队列的大小,准备遍历下一层的节点。
- 更新方向标志
flag
以交替遍历方向。
-
返回结果:
- 在遍历完所有层次后,返回包含每层节点值的结果列表。
代码
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if (root == nullptr) return {};
queue<TreeNode*> node_queue;
vector<vector<int>> ans;
node_queue.push(root);
int count = 1;
int flag = 1;
while (!node_queue.empty()) {
int temp_count = 0;
vector<int> temp_ans;
for (int i = 0; i < count; i++) {
TreeNode* node = node_queue.front();
node_queue.pop();
temp_ans.push_back(node -> val);
if (node -> left) {
node_queue.push(node -> left);
temp_count++;
}
if (node -> right) {
node_queue.push(node -> right);
temp_count++;
}
}
if (flag == -1) {
reverse(temp_ans.begin(), temp_ans.end());
}
flag *= -1;
ans.push_back(temp_ans);
count = temp_count;
}
return ans;
}
};