解题思路
题目要求为之字形层次遍历,故与层次遍历不同的是,可以设置一个栈,并设置一个标记,当标记对二求余为0时,表示当前层的下一层的遍历顺序是从右往左,则检测当前层的孩子结点时,则先左孩子入栈再右孩子入栈,最后当前层遍历完毕时,将栈中的元素从栈顶到栈底依次插入队列中。当标记对二求余为1时,表示下一层的遍历顺序是从左往右,则检测当前层的孩子结点时,先右孩子入栈,再左孩子入栈,当前层遍历完毕时,此时从栈顶到栈底则是下一层从左到右遍历的顺序,依次将栈中元素入队即可。当队列为空时,遍历结束。
代码
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 flag = 0;
while(!q.empty()){
int size = q.size();
vector<int>cur;
stack<TreeNode *>s;
while(size--){
TreeNode *tmp = q.front();
q.pop();
cur.push_back(tmp->val);
if(flag % 2 == 0){
if(tmp->left)
s.push(tmp->left);
if(tmp->right)
s.push(tmp->right);
}
else if(flag % 2 == 1){
if(tmp->right)
s.push(tmp->right);
if(tmp->left)
s.push(tmp->left);
}
}
res.push_back(cur);
while(!s.empty()){
q.push(s.top());
s.pop();
}
flag++;
}
return res;
}
};