【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个数。
  • 正确方式:将这个问题转换为图论问题,构建无权图。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值