专注 效率 记忆
预习 笔记 复习 做题
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458
本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。
第二十一天【剑指Offer例题代码 系列】
- 30. 栈的压入、弹出序列
- 31. 不分行从上往下打印二叉树( 层序遍历二叉树bfs )
- 32. 分行从上往下打印二叉树( 利用两个队列遍历 )
- 33. 之字形打印二叉树
- 34. 二叉搜索树的后序遍历序列
- 考点:根据二叉搜索树的后序遍历的特点
- 35. 二叉树中和为某一值的路径( dfs回溯 )
- 注意:只能是根节点到叶子节点
30. 栈的压入、弹出序列
原题链接
class Solution {
public:bool isPopOrder(vector<int> pushV,vector<int> popV) {if(popV.size() != pushV.size()){return false;}if(pushV.size()==0 && popV.size()==0)return true;stack<int> st;for(int i = 0,j = 0; i < popV.size(); i++){if(popV[j]!=pushV[i]){st.push(pushV[i]);}else{st.push(pushV[i]);while(st.size() && j < popV.size() && st.top() == popV[j]){st.pop();j++;}}}if(st.size()==0)return true;return false;}
};
31. 不分行从上往下打印二叉树( 层序遍历二叉树bfs )
原题链接
/*** 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> ans;if(root==NULL)return ans;queue<TreeNode*> q;q.push(root);while(q.size()){auto t = q.front();q.pop();ans.push_back(t->val);if(t->left != NULL)q.push(t->left);if(t->right != NULL)q.push(t->right);}return ans;}
};
32. 分行从上往下打印二叉树( 利用两个队列遍历 )
原题链接
/*** 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> get_val(vector<TreeNode*> level){vector<int> res;for (auto &u : level)res.push_back(u->val);return res;}vector<vector<int>> printFromTopToBottom(TreeNode* root) {vector<vector<int>>res;if (!root) return res;vector<TreeNode*>level;level.push_back(root);res.push_back(get_val(level));while (true){vector<TreeNode*> newLevel;for (auto &u : level){if (u->left) newLevel.push_back(u->left);if (u->right) newLevel.push_back(u->right);}if (newLevel.size()){res.push_back(get_val(newLevel));level = newLevel;}else break;}return res;}
};
33. 之字形打印二叉树
原题链接
本题和上一道题差不多
就是需要定义一个变量
判断是否需要翻转
/*** 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> get_val(vector<TreeNode*> level){vector<int> res;for (auto &u : level)res.push_back(u->val);return res;}vector<vector<int>> printFromTopToBottom(TreeNode* root) {vector<vector<int>>res;if (!root) return res;vector<TreeNode*>level;level.push_back(root);res.push_back(get_val(level));bool zigzag = true;while (true){vector<TreeNode*> newLevel;for (auto &u : level){if (u->left) newLevel.push_back(u->left);if (u->right) newLevel.push_back(u->right);}if (newLevel.size()){vector<int>temp = get_val(newLevel);if (zigzag)reverse(temp.begin(), temp.end());res.push_back(temp);level = newLevel;}else break;zigzag = !zigzag;}return res;}
};
34. 二叉搜索树的后序遍历序列
原题链接
考点:根据二叉搜索树的后序遍历的特点
由于是后序遍历,所以最后一个结点就是根节点,又因为是二叉搜索树,所以从第一个结点开始所有比它小的结点就是它的左子树,其他就是它的右子树。如果右子树有点不大于根节点的话就说明不是一棵二叉搜索树,返回false。最后递归处理左右子树。
class Solution {
public:vector<int> seq;//设成全局变量方便操作bool verifySequenceOfBST(vector<int> sequence) {seq = sequence;return dfs(0, seq.size() - 1);}bool dfs(int l, int r){//如果区间内啥也没有就说明把所有的结点都判断完了,却没有一个是有问题的,所以返回trueif (l >= r)return true;//取出根节点int root = seq[r];//找出所有从l开始连续的比根节点小的结点int k = l;while (k < r && seq[k] < root)k ++;//这时k就是右子树后序遍历中的第一个结点//如果不满足二叉搜索树的性质就返回falsefor (int i = k; i < r; i ++)if (seq[i] < root)return false;//递归处理左右子树//y总的视频里的代码是错的//他写的是return dfs(l, k - 1) && dfs(k + 1, r);//这样会WAreturn dfs(l, k - 1) && dfs(k, r - 1);}
};
35. 二叉树中和为某一值的路径( dfs回溯 )
注意:只能是根节点到叶子节点
原题链接
首先补充题意:本题要求的路径是根节点到叶子节点
本题就是一个dfs回溯问题
/*** 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<vector<int>> ans;vector<vector<int>> findPath(TreeNode* root, int sum) {vector<int> sup;dfs(root,sum,sup);return ans;}void dfs(TreeNode* root,int sum,vector<int>& sup){if(root == NULL)return;sum -= root->val;sup.push_back(root->val);if(root->left == NULL && root->right == NULL && sum == 0)ans.push_back(sup);dfs(root->left,sum,sup);dfs(root->right,sum,sup);sum += root->val;sup.pop_back();}};