给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
程序输出:
3 20 9 15 7
和上题层次遍历的迭代思路一样,只不过在每层遍历的时候用双端队列,偶数层在后面加(从零层开始算),即从左往右,奇数层在前面加(从零层开始算),即从右往左。
直接看代码好了
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> res;
if(root == NULL)
return res;
queue<TreeNode*> q;
q.push(root);
int level = 0;
while(!q.empty()){
int n = q.size();
deque<int> temp; //双端队列
for(int i = 0; i < n; i++){ // 一层
TreeNode* p = q.front();
q.pop();
if(level % 2 == 0)
temp.push_back(p->val); //偶数层在后面加(从零层开始算),即从左往右
else
temp.push_front(p->val); //奇数层在前面加(从零层开始算),即从右往左
if(p->left)
q.push(p->left);
if(p->right)
q.push(p->right);
}
res.push_back(vector<int>(temp.begin(), temp.end())); //添加到结果中
level++;
}
return res;
}
};