Copy //use two stack
/**
* 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) {
stack<TreeNode*> q1,q2;
vector<vector<int>> res;
if(root==NULL)
return res;
bool bo=true;
q1.push(root);
while(true){
if(bo){
vector<int> ve;
while(!q1.empty()){
TreeNode* tmp=q1.top();
q1.pop();
if(tmp==NULL)
break;
ve.push_back(tmp->val);
if(tmp->left)
q2.push(tmp->left);
if(tmp->right)
q2.push(tmp->right);
}
res.push_back(ve);
bo=false;
if(q2.empty())
break;
}
else{
vector<int> ve;
while(!q2.empty()){
TreeNode* tmp=q2.top();
q2.pop();
if(tmp==NULL)
break;
ve.push_back(tmp->val);
if(tmp->right)
q1.push(tmp->right);
if(tmp->left)
q1.push(tmp->left);
}
res.push_back(ve);
bo=true;
if(q1.empty())
break;
}
}
return res;
}
};
//use one queue
/**
* 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) {
queue<TreeNode*> q;
vector<vector<int>> res;
if(root==NULL)
return res;
bool leftToRight=true;
TreeNode* tmp = new TreeNode(-1);
q.push(root);q.push(tmp);
vector<int> ve(1);
int i=0;
while(true){
TreeNode* t=q.front();
q.pop();
if(t==tmp){
res.push_back(ve);
ve.clear();
ve.resize(q.size());
if(q.empty())
break;
q.push(tmp);
leftToRight=!leftToRight;
i=0;
continue;
}
if(t->left)
q.push(t->left);
if(t->right)
q.push(t->right);
if(leftToRight){
ve[i]=t->val;
}else{
ve[ve.size()-i-1]=t->val;
}
i++;
}
return res;
}
};