• 【算法】剑指offer-栈的压入,弹出序列&&从上到下打印二叉树


    栈的压入、弹出序列

    输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但
    4,3,5,1,2就不可能是该压栈序列的弹出序列.(注意:这两个序列的长度是相等的)

    解题思路:

    • 要判定第二个序列是否可能是该栈的弹出序列,就要使用指定的入栈顺序模拟出来对应的弹栈序列,我们设入栈顺序序列式pushV, 可能出栈序列popV
    • popv的第一个元素,一定是最后入栈,最先弹栈的,而我们的入栈顺序是一定的
    • 也就决定了,我们必须一直入栈,直到碰到popv的第一个元素,然后开始弹栈
    • 最后在循环这个过程,如果符合要求,最后栈结构一定是空的

    1.如果当前栈顶元素和出栈序列现在指向的元素不相同 或者栈为空
    -> 就要一直进栈,直到当前栈顶元素和出现序列现在指向的元素相同

    2.如果当前栈顶元素和出栈序列现在指向的元素相同
    ->出栈序列往后走,弹出栈顶元素,继续比较 (要保证:栈不为空&&栈顶元素==当前出栈序列指向的元素)

    image-20220418110353823

    class Solution {
    public:
        bool IsPopOrder(vector<int> pushV,vector<int> popV)
        {
            //先做特殊性判定
            if(pushV.empty() || popV.empty() || popV.size() != pushV.size())
            {
                return false;
            }
            //遍历入栈序列
            stack<int> st;
            int j = 0;
            for(int i = 0;i<pushV.size();i++)
            {
                st.push(pushV[i]);//把当前入栈序列元素入栈
                //模拟栈的入栈和出栈序列
                //如果栈不为空 && 当前栈顶元素==出栈元素,就一直往后比较出栈序列的元素
                //如果该条件不满足,就要一直入栈
                //如果该条件满足,就要一直出栈
                //pushV代表对应的入栈逻辑,popV代表对应的出栈逻辑
                while(!st.empty() && st.top() == popV[j])
                {
                    j++;
                    st.pop();//去掉栈顶元素,比较下一个元素
                }
            }
            //如果最后栈为空,说明第二个序列是该栈的弹出顺序
            return st.empty();
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30

    从上到下打印二叉树

    从上往下打印出二叉树的每个节点,同层节点从左至右打印

    本质是层序遍历

    class Solution {
    public:
        vector<int> PrintFromTopToBottom(TreeNode* root) {
            vector<int> v;
            if(root==nullptr)
            {
                return v;//返回空容器
            }
            queue<TreeNode*> q;//用于层序遍历
            q.push(root);
    
            while(!q.empty())
            {
                TreeNode* node = q.front();
                q.pop();
                v.push_back(node->val);//把当前节点的值放到容器中
                
                //处理左右孩子入队列
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            return v;
        }
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

  • 相关阅读:
    Lens5 指南:专为Kubernetes人员设计的IDE
    git remote 使用方法
    第四章:项目整合管理
    一文看分布式锁
    Vue3+Ts+Vite项目(第十二篇)——echarts安装与使用,vue3项目echarts组件封装
    从零开始的C++(十)
    Java练习题-输出二维数组对角线元素和
    《Docker极简教程》--Docker服务管理和监控--Docker服务的监控
    自己的回忆录,记录自己的青春
    Java基础篇反射机制总结
  • 原文地址:https://blog.csdn.net/chuxinchangcun/article/details/127119818