题目描述:
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
AC C++ Solution:
使用一个双端队列解决“之”字型遍历:
/**
* 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;
if(!root) return res;
deque<TreeNode*> deq;
deq.push_back(root);
bool ltor=false; //left to right
while(!deq.empty()) {
int sz=deq.size();
ltor = !ltor ;
vector<int> row;
while(sz--) {
if(ltor) {
root = deq.back(); deq.pop_back();
row.push_back(root->val);
if(root->left) deq.push_front(root->left);
if(root->right) deq.push_front(root->right);
}
else {
root = deq.front(); deq.pop_front();
row.push_back(root->val);
if(root->right) deq.push_back(root->right);
if(root->left) deq.push_back(root->left);
}
}
res.push_back(row);
}
return res;
}
};
从左到右遍历时,从队列尾取节点,并把子节点按左到右的顺序依次加入队列头;
从右到左遍历时,从队列头取节点,并把子节点按右到左的顺序依次加入队列尾;