一.题目描述
给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层序遍历如下:
[
[3],
[20,9],
[15,7]
]
来源:力扣(LeetCode)
链接:题目来源
二.问题分析
1)对于二叉树层序遍历我们使用广度优先搜索,一层一层向下输出。
2)考虑到问题要求锯齿波形的输出,我们可以充分利用vector的强大插入能力。在奇数深度时,我们使用emplace_back(val),从左到右放入数组;当为偶数深度时,我们使用insert(name.begin(),val)从右向左输入即可。
3)除了输出有区别外,其余情况与二叉树的层序遍历完全相同。
4)二叉树结点的代码:
/**
* 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>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>>res; //目标数组
queue<TreeNode*> q; //存放结点的队列
if (root == NULL) return res; //判空
q.push(root);
int depth = 0; //标明深度
while(!q.empty())
{
int n = q.size();
vector<int>ans;
for (int i=0;i<n;i++)
{
TreeNode * root = q.front();
q.pop();
if(depth%2==0) //奇数深度数插入数组末尾
{
ans.emplace_back(root->val);
}else //偶数深度是插入数组头部
{
ans.insert(ans.begin(),root->val);
}
if(root->left!=NULL) q.push(root->left);
if(root->right!=NULL) q.push(root->right);
}
depth++;
res.emplace_back(ans); //加入目标数组
}
return res;
}
};
四.感想
一开始看到这道题时,我脑子里直接想的是使用双端队列,因为他可以控制入队和出队的方向。但是在出去一个元素下一个再进入时处理比较麻烦。后来想到我可以控制队列仍然为头部出,尾部进,我只要知道控制输入数组时的顺序就好了,这样极大的简化了问题。