题目描述
给定一个二叉树,返回该二叉树的之字形层序遍历,(从左向右,下一层从右向左,一直这样交替)
例如:
给定的二叉树是{3,9,20,#,#,15,7},
3↵ / ↵ 9 20↵ / ↵ 15 7
该二叉树之字形层序遍历的结果是
[↵ [3],↵ [20,9],↵ [15,7]↵]
如果你不清楚“{1,#,2,3}"的含义的话,请继续阅读
我们用如下方法将二叉树序列化:
二叉树的序列化遵循层序遍历的原则,”#“代表该位置是一条路径的终结,下面不再存在结点。
例如:
1↵ / ↵ 2 3↵ /↵ 4↵ ↵ 5
上述的二叉树序列化的结果是:"{1,2,3,#,#,4,#,#,5}".
解题思路
利用flag作为标记,来判断是否需要倒置。
/**
* 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) {
vector<vector<int> > res;
if(root == NULL)
return res;
queue<TreeNode*> que;
que.push(root);
int flag = 0;
while(que.size() != 0){
vector<int> cnt;
int len = que.size();
for(int i = 0; i < len; i++){
TreeNode *p = que.front();
que.pop();
cnt.push_back(p->val);
if(p->left)
que.push(p->left);
if(p->right)
que.push(p->right);
}
if(flag == 0)
flag = 1;
else{
reverse(cnt.begin(), cnt.end());
flag = 0;
}
res.push_back(cnt);
}
return res;
}
};