[LeetCode] Binary Tree Zigzag Level Order Traversal

由于最近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;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_34035179/article/details/78764384
今日推荐