Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to right, then right to left for the next level and alternate between).
zigzag层次遍历,分析之后得知,可以用两个栈来辅助遍历。参差遍历本来是用一个队列就行。但是这个用两个栈,然后定义一个bool变量指定现在是左到右还是右到左,分别用一个栈辅助遍历。最后处理方式和层次遍历一样
使用两个栈的方法肯定还有优化的地方,去看了discuss之后,发现可以直接使用一个队列来做。最后遍历的结果需保存在一个vector中,我们默认只能push_back但是其实可以先定义好vector,最后看情况从左右分别将结果放置进去。
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;
}
};