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] ]
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
ALternative stacks
/**
* Definition for binary tree
* 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) {
// Note: The Solution object is instantiated only once and is reused by each test case.
vector<vector<int>> result;
if(root==NULL)
return result;
stack<TreeNode*> stack1;
stack<TreeNode*> stack2;
stack1.push(root);
while(!stack1.empty() || !stack2.empty())
{
vector<int> newlevel1;
while(!stack1.empty())
{
TreeNode* node=stack1.top();
newlevel1.push_back(node->val);
stack1.pop();
if(node->left!=NULL) stack2.push(node->left);
if(node->right!=NULL) stack2.push(node->right);
}
if(newlevel1.size()!=0)
result.push_back(newlevel1);
vector<int> newlevel2;
while(!stack2.empty())
{
TreeNode* node=stack2.top();
newlevel2.push_back(node->val);
stack2.pop();
if(node->right!=NULL) stack1.push(node->right);
if(node->left!=NULL) stack1.push(node->left);
}
if(newlevel2.size()!=0)
result.push_back(newlevel2);
}
return result;
}
};