给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左)
思路:广度优先遍历
用队列维护当前层的所有元素,当队列不为空的时候,求得当前队列的长度size,每次从队列中取出size个元素进行拓展,然后进行下一次迭代。
- 对于层序遍历,通过一个队列即可完成,思想即:队首节点的孩子节点入队,然后队首节点出队,输出该节点存放数值。
- 若要分层,只需每次循环时记录队列的大小即可,该大小即为当前层内的节点数量,而后用一个vector存储当前层所有节点内存储的数值即可。
- 现在要锯齿形层序遍历,增加计数器level,当level是奇数时,temp即为当前层所求结果,若level是偶数,则将temp进行翻转,调用reverse即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if (!root) return {};
vector<vector<int>> res = {};
vector<int> temp;
queue<TreeNode*>q;
int n, level = 1;
q.push(root);
while(!q.empty())
{
n = q.size();
while(n-- > 0)
{
temp.push_back(q.front()->val);
if (q.front()->left) q.push(q.front() -> left);
if (q.front()->right) q.push(q.front() -> right);
q.pop();
}
if (level & 1) res.push_back(temp);
else {
reverse(temp.begin(), temp.end());
res.push_back(temp);
}
temp.clear();
level++;
}
return res;
}
};