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).
For example:
Given binary tree{3,9,20,#,#,15,7},
3
/
9 20
/
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
//正常层序遍历 然后每隔一层翻转
//两个stack
class Solution {
public:
vector<vector<int> > zigzagLevelOrder(TreeNode *root)
{
vector<vector<int> >res;
if (NULL == root)
return res;
stack<TreeNode *> sltor,srtol;
sltor.push(root);
while(!(sltor.empty() && srtol.empty()))
{
vector<int> vectmp;
if(!sltor.empty())
{
while(!sltor.empty())
{
TreeNode * tmp = sltor.top();
sltor.pop();
vectmp.push_back(tmp->val);
if (NULL != tmp->left)
srtol.push(tmp->left);
if (NULL != tmp->right)
srtol.push(tmp->right);
}
}
else
{
while(!srtol.empty())
{
TreeNode * tmp = srtol.top();
srtol.pop();
vectmp.push_back(tmp->val);
if (NULL != tmp->right)
sltor.push(tmp->right);
if (NULL != tmp->left)
sltor.push(tmp->left);
}
}
res.push_back(vectmp);
}
return res;
}
};
测试
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
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 (NULL == root)
return res;
stack<TreeNode *> sltor,srtol;
sltor.push(root);
while(!(sltor.empty() && srtol.empty()))
{
vector<int> vectmp;
if(!sltor.empty())
{
while(!sltor.empty())
{
TreeNode * tmp = sltor.top();
sltor.pop();
vectmp.push_back(tmp->val);
if (NULL != tmp->left)
srtol.push(tmp->left);
if (NULL != tmp->right)
srtol.push(tmp->right);
}
}
else
{
while(!srtol.empty())
{
TreeNode * tmp = srtol.top();
srtol.pop();
vectmp.push_back(tmp->val);
if (NULL != tmp->right)
sltor.push(tmp->right);
if (NULL != tmp->left)
sltor.push(tmp->left);
}
}
res.push_back(vectmp);
}
return res;
}
};
int main()
{
TreeNode * root = new TreeNode(13);
root->left = new TreeNode(9);
root->right = new TreeNode(20);
root->right->left = new TreeNode(15);
root->right->right = new TreeNode(17);
//root->left->left = new TreeNode(9);
//root->left->right = new TreeNode(12);
Solution s;
vector<vector<int> > vec = s.zigzagLevelOrder(root);
for(int i=0;i<vec.size();i++)
{
for (int j=0;j<vec[i].size();j++)
{
cout<<vec[i][j]<<" ";
}
cout<<endl;
}
}