层序遍历的变种:
相比与层序遍历,需要多做的事情是:
定义一个i标识是第几层
如果i是偶数层,说明从左向右遍历
i是奇数层,从右向左遍历
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> vv;
if(root==nullptr) return vv; //空树直接返回空vector
queue<TreeNode*> q;
q.push(root);
int i = 0; //标识层数
// 0 1 2 3 4
//偶数就是从左向右 奇数就是从右向左
while(!q.empty()){
int lever_size = q.size(); //本层的数据个数
vector<int> cur;
while(lever_size--){
TreeNode* front = q.front(); //拿到队头
q.pop(); //出队
//把不为空的孩子入队
if(front->left){
q.push(front->left);
}
if(front->right){
q.push(front->right);
}
cur.push_back(front->val);
}
//如果是奇数层,逆置本层输出到cur
if(i%2==1){
reverse(cur.begin(),cur.end());
}
++i; //更新层数
//放入vv
vv.push_back(cur);
}
return vv;
}
};