文章目录
- 剑指offerWeek3
- 周六:栈的压入、弹出序列
- AC代码
- 思路:
- 周六:不分行从上往下打印二叉树
- AC代码
- 思路:
剑指offerWeek3
周六:栈的压入、弹出序列
题目链接:栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
假设压入栈的所有数字均不相等。例如序列 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
AC代码
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]
AC代码
/*** 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())
{- 队首出队- 判断队首可达点- 可达点入队
}