由于最近dp写的太多了,看什么题都像dp,就random pick one来换换口味,有好些都感觉太简单了,这道虽然不难,但是对于加深层次遍历的理解还是有用的。
题目
分析
这题的思路其实很直接,就在逆序输出的时候,用一个stack作为中转(后来发现algorthm有个reverse函数,就直接调用reverse了,不必浪费空间)。其实还可以优化,但是只是代码上的,时间复杂度并不能优化了。而且做出来也已经达到最快的那一列了,只用了3ms。
时间复杂度分析
考虑树的element个数是n(不包括null)。那么,时间复杂度为O(N),对于这种遍历的题目来说,已经达到了最快了。
代码
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) {
queue<pair<int, TreeNode*> > q;
vector<vector<int> > ans;
vector<int> level;
if (root == NULL) return ans;
// 0 means positive direction, 1 means negative
q.push(make_pair(0, root));
while (!q.empty()) {
auto p = q.front();
if (p.first == 0) {
q.pop();
level.push_back(p.second->val);
if (p.second->left) q.push(make_pair(1, p.second->left));
if (p.second->right) q.push(make_pair(1, p.second->right));
} else {
ans.push_back(level);
level.clear();
while (q.front().first == 1) {
p = q.front();
level.push_back(p.second->val);
if (p.second->left) q.push(make_pair(0, p.second->left));
if (p.second->right) q.push(make_pair(0, p.second->right));
q.pop();
}
reverse(level.begin(), level.end());
ans.push_back(level);
level.clear();
}
}
if (!level.empty()) ans.push_back(level);
return ans;
}
};