Problem :
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).
Example:
For example:
Given binary tree [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
return its zigzag level order traversal as:
[
[3],
[20,9],
[15,7]
]
**
Algorithm:
**
很明显要用宽度优先遍历,因为这个题目要求要的输出很节点在的高度有关,所以普通的宽度优先遍历不行,在我下面的非递归方法中,需要给每一层后面加一个NULL来标明一层的结束,这样就可以明确什么时候进入了下一层。有N个节点,那么时间复杂度就是O(N)
**
Code:
/**
* 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) {
vector<vector<int> > re;
if(root==NULL)
return re;
queue<TreeNode*> q;
q.push(root);
q.push(NULL);
int tag=1;
vector<int> v;
while(!q.empty())
{
TreeNode* t=q.front();q.pop();
if(t!=NULL)
{
v.push_back(t->val);
if(t->right)q.push(t->right);
if(t->left)q.push(t->left);
}
else
{
if(tag==0)
{
re.push_back(v);
}
else
{
reverse(v.begin(),v.end());
re.push_back(v);
}
tag=!tag;
v.clear();
if(!q.empty())
q.push(NULL);
}
}
return re;
}
};