专注 效率 记忆
预习 笔记 复习 做题
欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!
本博客带大家一起学习,我们不图快,只求稳扎稳打。
由于我高三是在家自学的,经验教训告诉我,学习一定要长期积累,并且复习,所以我推出此系列。
只求每天坚持40分钟,一周学5天,复习2天
也就是一周学10道题
50天后我们就可以学完76道题,相信50天后,我们一定可以有扎实的代码基础!我们每天就40分钟,和我一起坚持下去吧!
qq群:866984458
本题出自 acwing网站
这个系列是免费的
打卡即刻退回费用。
第十九天【剑指Offer例题代码 系列】
- 25. 树的子结构( 递归中调用递归 )
- 26. 二叉树的镜像(两个指针互换可用 swap)
- 27. 对称的二叉树
- 错解:通过根节点比较子节点
- 正解:比较当前节点的值即可
- 28. 顺时针打印矩阵
- 29. 包含min函数的栈
25. 树的子结构( 递归中调用递归 )
原题链接
/**
* 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:
bool hasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if (!pRoot1 || !pRoot2) return false;
if (isSame(pRoot1, pRoot2)) return true;
return hasSubtree(pRoot1->left, pRoot2) || hasSubtree(pRoot1->right, pRoot2);
}
bool isSame(TreeNode* pRoot1, TreeNode* pRoot2) {
if (!pRoot2) return true;
if (!pRoot1 || pRoot1->val != pRoot2->val) return false;
return isSame(pRoot1->left, pRoot2->left) && isSame(pRoot1->right, pRoot2->right);
}
};
26. 二叉树的镜像(两个指针互换可用 swap)
原题链接
/**
* 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:
void mirror(TreeNode* root) {
if (!root) return;
swap(root->left, root->right);
mirror(root->left);
mirror(root->right);
}
};
27. 对称的二叉树
原题链接
错解:通过根节点比较子节点
没写完,太复杂
/**
* 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:
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
return dfs(root->left,root->right);
}
bool dfs(TreeNode* r1,TreeNode* r2)
{
if(r1==NULL && r2==NULL)
return true;
if(r1!=NULL&&r2==NULL || r1==NULL&&r2!=NULL)
return false;
if(r1->left->val != r2->right->val || r1->right->val != r2->left->val)
return false;
return dfs(r1->left,r2->right) && dfs(r1->right,r2->left);
}
};
正解:比较当前节点的值即可
/**
* 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:
bool isSymmetric(TreeNode* root) {
if(root == NULL)
return true;
return dfs(root->left,root->right);
}
bool dfs(TreeNode* r1,TreeNode* r2)
{
if(r1==NULL && r2==NULL)
return true;
if(r1!=NULL&&r2==NULL || r1==NULL&&r2!=NULL)
return false;
if(r1->val != r2->val)
return false;
return dfs(r1->left,r2->right) && dfs(r1->right,r2->left);
}
};
28. 顺时针打印矩阵
原题链接
class Solution {
public:
vector<int> printMatrix(vector<vector<int>>& matrix) {
vector<int> res;
if (matrix.empty()) return res;
int n = matrix.size(), m = matrix[0].size();
vector<vector<bool>> st(n, vector<bool>(m, false));
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int x = 0, y = 0, d = 1;
for (int k = 0; k < n * m; k ++ )
{
res.push_back(matrix[x][y]);
st[x][y] = true;
int a = x + dx[d], b = y + dy[d];
if (a < 0 || a >= n || b < 0 || b >= m || st[a][b])
{
d = (d + 1) % 4;
a = x + dx[d], b = y + dy[d];
}
x = a, y = b;
}
return res;
}
};
29. 包含min函数的栈
原题链接
本题我们用样例说话
- 比如是 1 2 3 4 5
那么对应的最小栈就是 1 - 如果是 5 4 3 2 1
对应就是 5 4 3 2 1 - 如果是 3 1 2 4 5
对应是 3 1
所以我们创建一个最小栈
如果入栈的值 小于 栈顶的值
就入最小栈
否则只入栈,不入最小栈
当最小栈和普通栈的栈顶一样时 出栈
class MinStack {
public:
/** initialize your data structure here. */
stack<int> stackValue;
stack<int> stackMin;
MinStack() {
}
void push(int x) {
stackValue.push(x);
if (stackMin.empty() || stackMin.top() >= x)
stackMin.push(x);
}
void pop() {
if (stackMin.top() == stackValue.top()) stackMin.pop();
stackValue.pop();
}
int top() {
return stackValue.top();
}
int getMin() {
return stackMin.top();
}
};
/**
* Your MinStack object will be instantiated and called as such:
* MinStack obj = new MinStack();
* obj.push(x);
* obj.pop();
* int param_3 = obj.top();
* int param_4 = obj.getMin();
*/