LeetCode栈和队列问题

Posted 超级无敌陈大佬的跟班

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode栈和队列问题相关的知识,希望对你有一定的参考价值。

栈Stack

考点1:二叉树的层序遍历

LeetCode102.对一个二叉树进行层序遍历

 ///考点:队列
 ///思路:构建一个队列,通过队列去层序遍历二叉树
 //时间复杂度:每个点进队出队各一次,故渐进时间复杂度为 O(n)。
 //空间复杂度:队列中元素的个数不超过n个,故渐进空间复杂度为 O(n)
 //方法二:内存优化版,不用创建一个单独的变量记录节点的深度
class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> v_result;
        if(root == nullptr)
            return v_result;

        queue<TreeNode*> que;
        que.emplace(root);
        while (!que.empty()){
            int nodeSum = que.size();   //这里最开始,队列中元素个数即为当前层二叉树节点个数
            v_result.push_back(vector<int>());  //为新的一层push一个vector

            ///==循环变量当前层所有的节点.
            ///(特殊点就是nodeSum,它就是当前层的节点数量)不能超过nodeSum,不然就到了下一层的节点
            for(int i = 0; i < nodeSum; i++){
                auto node = que.front();
                que.pop();
                v_result.back().push_back(node->val);   //.back()是容器的最后一个元素
                if(node->left)
                    que.emplace(node->left);
                if(node->right)
                    que.emplace(node->right);
            }
        }
        return v_result;
    }
};
///考点:队列
///思路:构建一个队列,通过队列去层序遍历二叉树
//时间复杂度:每个点进队出队各一次,故渐进时间复杂度为 O(n)。
//空间复杂度:。
class Solution2 {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> v_result;
        if(root == nullptr)
            return v_result;

        queue<pair<TreeNode*, int>> que;    //构建一个pair对来存放 二叉树的节点 和 节点对应的第几层
        que.emplace(make_pair(root, 0));
        while (!que.empty()){
            auto node = que.front();
            int treeLevel = node.second;
            que.pop();

            if(treeLevel == v_result.size()){ //当为新的一层时添加vector用于装该层的所有节点
                v_result.push_back(vector<int>());
            }

            v_result[treeLevel].push_back(node.first->val); //将节点的值放到对应层的vector中

            //将当前节点的左右节点放到队列中
            if(node.first->left)
                que.emplace(make_pair(node.first->left, treeLevel + 1));
            if(node.first->right)
                que.emplace(make_pair(node.first->right, treeLevel + 1));
        }
        return v_result;
    }
};

LeetCode107.对二叉树进行层序遍历,返回底层到上层所有的节点。

考点二:BFS和图的最小路径

解题误区:

  • 这题不能使用贪心算法求解,例如:12 = 3*3 + 1*1 + 1*1 +1*1.共有4个数。但正确结果为12 = 2*2 + 2*2 + 2*2.共有3个数。
  • 正确方式:将这个问题转换为图论问题,构建无权图。

以上是关于LeetCode栈和队列问题的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode通关:栈和队列六连,匹配问题有绝招

LeetCode栈和队列问题

leetcode 栈和队列的互相实现

栈和队列_leetcode341

日常系列LeetCode《10·栈和队列篇》

leetcode刷题记录——栈和队列