每日一题day6
题目描述
求解思路
官方求解思路翻转相对麻烦。
按照层序遍历标准写法(即每层都是从左到右的),然后每遍历完一层之后,把存到结果vector中的顺序给改变一下,最开始存的顺序从左到右(即第0层),用一个bool标志位记录即可。
如何知道遍历完一层
用一个队列保存节点,求队列大小l,然后从队列取l次节点,即遍历完一层,此时队列中保存的就是下一层节点。
C++实现
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> ans;
queue<TreeNode *> q;
TreeNode *temp;
if(root) q.push(root);
bool flag = true;//flag为真表示顺序存储
while(!q.empty()){
int s = q.size();
vector<int> T(s,0);
for(int i = 0;i < s;i++){//遍历完一层
temp = q.front();
q.pop();
if(flag) T[i] = temp->val;
else T[s-1-i] = temp->val;
if (temp->left) q.push(temp->left);
if (temp->right) q.push(temp->right);
}
ans.push_back(T);
flag = !flag;
}
return ans;
}
};