题目:
给定一个二叉树,返回其节点值的锯齿形层次遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
例如:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回锯齿形层次遍历如下:
[
[3],
[20,9],
[15,7]
]
AC代码:
class Solution {
private:
vector<vector<int>> rev;
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
if (!root)
return rev;
deque<TreeNode *> dq;
stack<TreeNode*> ss;
vector<int> vec;
dq.push_back(root);
vec.push_back(dq.front()->val);
rev.push_back(vec);
int check = 1;
int count = 0;
while (!dq.empty() || !ss.empty()){
++check;
count = (check & 1)? ss.size() : dq.size();
vec.clear();
while (--count >= 0){
//偶数
if ((check & 1) == 0){
if (dq.back()->right){
ss.push(dq.back()->right);
vec.push_back(ss.top()->val);
}
if (dq.back()->left){
ss.push(dq.back()->left);
vec.push_back(ss.top()->val);
}
dq.pop_back();
}
//奇数
else{
if (ss.top()->left){
dq.push_back(ss.top()->left);
vec.push_back(dq.back()->val);
}
if (ss.top()->right){
dq.push_back(ss.top()->right);
vec.push_back(dq.back()->val);
}
ss.pop();
}
}
if (vec.size())
rev.push_back(vec);
}
return rev;
}
};