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栈和队列问题的主要内容,如果未能解决你的问题,请参考以下文章