【每日刷题】Day89

【每日刷题】Day89

🥕个人主页:开敲🍉

🔥所属专栏:每日刷题🍍

🌼文章目录🌼

1. 102. 二叉树的层序遍历 - 力扣(LeetCode)

2. 155. 最小栈 - 力扣(LeetCode)

3. 栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

1. 102. 二叉树的层序遍历 - 力扣(LeetCode)

//思路:队列。

//层序遍历,使用一个队列存储节点指针,每一次从队头获取元素,判断当前指针指向节点的左结点和右节点是否为空,存储左右节点,将队头元素删除。

//特别地,这里我们使用一个变量来记录当前层的节点个数,根据上一层所有父节点带出的子节点个数就能判断当前层的节点个数,知道节点个数后我们创建vector<int>变量存储当前层所有节点地值。

//当前层遍历结束后,我们将当前层地vector<int>尾插入vector<vector<int>>中。

class Solution {

public:

    vector<vector<int>> levelOrder(TreeNode* root)

    {

        vector<vector<int>> ans;

        int tiersize = 0;

        queue<TreeNode*> q;

//判断树是否存在

        if(root)

        {

            q.push(root);

            tiersize++;

        }

       

//根据队列是否为空判断树是否遍历完

        while(!q.empty())

        {

//v用于存储每一层节点的val

            vector<int> v;

//tiersize为当前层节点个数

            while(tiersize--)

            {

                TreeNode* tmp = q.front();

//将当前节点val插入v

                v.push_back(tmp->val);

//弹出队头元素

                q.pop();

//存储队头元素的左右子节点

                if(tmp->left)

                    q.push(tmp->left);

                if(tmp->right)

                    q.push(tmp->right);

            }

//当前层遍历完毕,将v尾插入ans

            ans.push_back(v);

            tiersize = q.size();

        }

        return ans;

    }

};

2. 155. 最小栈 - 力扣(LeetCode)

//思路:两个栈模拟实现,st1和st2。

//st1用于存储数据,st2用于存储栈中的最小元素,保证最小的元素始终在st2的栈顶。

class MinStack {

public:

    MinStack()

    {}

   

    void push(int val)

    {

//st1啥也不用想,直接插入数据

        st1.push(val);

//st2插入数据两种情况:

① st2为空

② 当前val ≤ st2栈顶元素

        if(st2.empty()||val<=st2.top())

            st2.push(val);

    }

   

    void pop()

    {

//如果st2栈顶元素和st1栈顶元素相同,则st2也要删除,保证st2中的栈顶元素始终是st1中的最小值

        if(st2.top()==st1.top())

            st2.pop();

//st1直接删除元素

        st1.pop();

    }

   

    int top()

    {

        return st1.top();

    }

   

    int getMin()

    {

        return st2.top();

    }

    private:

    stack<int> st1;

    stack<int> st2;

};

3. 栈的压入、弹出序列_牛客题霸_牛客网 (nowcoder.com)

//思路:模拟。

//我们利用一个栈s1来模拟是否可能出现popV的出栈情况。

//使用迭代器it1和it2分别遍历pushV和popV,如果它们当前元素不同,则将pushV的当前元素插入s1,it1++;如果pushV和popV相同,则将it1和it2都++,不需要将元素插入s1中。

//特别地,如果pushV和popV当前元素不同,也需要判断一下popV当前元素是否和s1栈顶元素相同,这个情况模拟的是栈在弹出一个元素后又弹出一个元素或多个元素。

//最后结果判断标准为:

//如果it2没有走到末尾,则依次从s1栈顶拿取元素后弹出栈顶元素,同时遍历pushV,如果s1的栈顶元素和pushV的元素不同,则返回false。

//最后返回栈s1是否为空

class Solution {

public:

    bool IsPopOrder(vector<int>& pushV, vector<int>& popV)

    {

        stack<int> s1;

        vector<int>::iterator it1 = pushV.begin();

        vector<int>::iterator it2 = popV.begin();

        while(it1!=pushV.end())

        {

//如果*it1和*it2不同,则将*it1入s1,it1++

            if(*it1!=*it2)

            {

                s1.push(*it1);

                it1++;

            }

            else

             {

//否则,模拟出栈过程

                while(*it1==*it2&&it1!=pushV.end())

                {

                    it1++;

                    it2++;

                }

                while(!s1.empty()&&*it2==s1.top())

                {

                    s1.pop();

                    it2++;

                }

             }

        }

        while(!s1.empty()&&it2!=popV.end())

        {

//拿取栈顶元素与popV剩余元素依次比较

            if(*it2==s1.top())

                s1.pop();

            it2++;

        }

        return s1.empty();

    }

};

  • 29
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值