题目链接:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。
例如序列 1,2,3,4,5
是某栈的压入顺序,序列 4,5,3,2,1
是该压栈序列对应的一个弹出序列,但 4,3,5,1,2
就不可能是该压栈序列的弹出序列。
注意:若两个序列长度不等则视为并不是一个栈的压入、弹出序列。若两个序列都为空,则视为是一个栈的压入、弹出序列。
数据范围
序列长度 [0,1000]
样例
输入:[1,2,3,4,5]
[4,5,3,2,1]
输出:true
class Solution {
public:
bool isPopOrder(vector<int> pushV,vector<int> popV) {
if (pushV.size() != popV.size()) return false;
int idx = 0;
stack<int> stk;
for (auto x : pushV)
{
stk.push(x);
while (stk.size() && stk.top() == popV[idx])
{
idx ++ ;
stk.pop();
}
}
if (!stk.empty()) return false;
return true;
}
};
整体思路
模拟题
模拟的模板思路
当前可走的路径
- 路径1
- 路径2
...
- 路径n
可走路径的条件
- 条件1
- 条件2
...
- 条件n
对应本题:
当前可执行的操作(路径)
- 压栈
- 弹栈
压栈的条件:
- 栈为空的时候肯定可压
- 其他条件比较难想,先放着
弹栈的条件
- 当栈不空
- 只要栈顶元素和输出顺序的数值相同时,即弹
因此:
每次都压栈一次,然后只要栈不空且栈顶元素和输出顺序的数值相同时,就弹栈
题目链接:不分行从上往下打印二叉树
从上往下打印出二叉树的每个结点,同一层的结点按照从左到右的顺序打印。
数据范围
树中节点的数量 [0,1000]
。
样例
输入如下图所示二叉树[8, 12, 2, null, null, 6, null, 4, null, null, null]
8
/ \
12 2
/
6
/
4
输出:[8, 12, 2, 6, 4]
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> printFromTopToBottom(TreeNode* root) {
vector<int> res;
if (!root) return res;
queue<TreeNode*> q;
q.push(root);
while (q.size())
{
auto t = q.front();
q.pop();
res.push_back(t->val);
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
return res;
}
};
整体思路
宽搜模板题
模板:
- 起点入队
- while (q.size())
{
- 队首出队
- 判断队首可达点
- 可达点入队
}