力扣打卡3

对于这道题,是在层次遍历的基础上做了简单的变形。

1.可以在每次遍历一层的时候,将其存入vector中,根据奇数还是偶数对其进行翻转,再存入答案的二维vector中。

2.可以用双端队列,如果奇数层,存队尾,取队首。反之存队首,取队尾。这是我第一次想到以及使用双端队列。有所收获。

翻转vector方式:

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        int flag=1;
        queue<TreeNode*> q;
        queue<int> d;
        int n=0;
        vector<vector<int>> ans;
        vector<int> t;
        if(root==nullptr) return ans;
        q.push(root);
        d.push(0);
        while(!q.empty())
        {
            if(d.front()>n)
            {
                flag*=(-1);
                if(flag==1) reverse(t.begin(),t.end());
                ans.push_back(t);
                t.clear();
                n++;
            }
            t.push_back(q.front()->val);
            if(q.front()->left)
            {
                q.push(q.front()->left);
                d.push(d.front()+1);
            }
            if(q.front()->right)
            {
                q.push(q.front()->right);
                d.push(d.front()+1);
            }
            q.pop();  d.pop();
        }
        flag*=(-1);
        if(flag==1) reverse(t.begin(),t.end());
        ans.push_back(t);
        return ans;
    }
};

双端队列(deque):

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        int flag=1;
        deque<TreeNode*> q;
        queue<int> d;
        int n=0;
        vector<vector<int>> ans;
        vector<int> t;
        if(root==nullptr) return ans;
        q.push_back(root);
        d.push(0);
        while(!q.empty())
        {
            if(d.front()>n)
            {
                flag*=(-1);
                ans.push_back(t);
                t.clear();
                n++;
            }
            if(flag==1)
            {
                
                t.push_back(q.front()->val);
                if(q.front()->left)
                {
                    q.push_back(q.front()->left);
                    d.push(d.front()+1);
                }
                if(q.front()->right)
                {
                    q.push_back(q.front()->right);
                    d.push(d.front()+1);
                }
                q.pop_front();  d.pop();
            }
            else
            {
                
                t.push_back(q.back()->val);
                if(q.back()->right)
                {
                    q.push_front(q.back()->right);
                    d.push(d.front()+1);
                }
                if(q.back()->left)
                {
                    q.push_front(q.back()->left);
                    d.push(d.front()+1);
                }
                q.pop_back();  d.pop();
            }
        }
        ans.push_back(t);
        return ans;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值