前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是七月集训第十五天:深度优先搜索🔥🔥🔥
一、练习题目
二、算法思路
- 1、2331.计算布尔二叉树的值:🔥递归判断就好。
- 2、951. 翻转等价二叉树:🔥分情况讨论并进行递归即可。
- 3、1992. 找到所有的农场组:🔥🔥深度优先搜索,并对到过的点进行标记,避免重复。
- 4、652. 寻找重复的子树:🔥🔥🔥🔥这题还没想明白,晚点再看看。
三、源码剖析
// 2331.计算布尔二叉树的值
class Solution {
public:
bool evaluateTree(TreeNode* root) {
if(root->left == nullptr && root->right == nullptr) {
return root->val;
} //(1)
if(root->val == 2) {
int ans = 0;
ans |= evaluateTree(root->left);
ans |= evaluateTree(root->right);
return ans;
}
if(root->val == 3) {
int ans = 1;
ans &= evaluateTree(root->left);
ans &= evaluateTree(root->right);
return ans;
} //(2)
return 0;
}
};
- 1、首先判断是不是叶子结点;
- 2、如果不是叶子结点分情况讨论即可。
// 951. 翻转等价二叉树
class Solution {
public:
bool flipEquiv(TreeNode* root1, TreeNode* root2) {
if(!root1 && !root2) {
return true;
}
if(!root1 && root2) {
return false;
}
if(root1 && !root2) {
return false;
}
if(root1->val != root2->val) {
return false;
}
return (flipEquiv(root1->left, root2->left) && flipEquiv(root1->right, root2->right)) ||
(flipEquiv(root1->left, root2->right) && flipEquiv(root1->right, root2->left));
}
};
- 1、简单题。
// 1992. 找到所有的农场组
class CustomStack {
class Solution {
int n, m;
bool vis[310][310];
int r1, c1, r2, c2;
int dir[4][2] = {
{0, 1},
{0, -1},
{1,0},
{-1,0}};
void dfs(vector<vector<int>>& land, int r, int c, int& r2, int &c2){
if(!land[r][c]){
return ;
}
land[r][c] = 0;
r2 = max(r2, r);
c2 = max(c2, c);
for(int i = 0; i < 4; ++i){
int tx = r + dir[i][0];
int ty = c + dir[i][1];
if(tx == -1 || ty == -1 || tx == m || ty == n){
continue;
}
dfs(land, tx, ty, r2, c2);
}
}
public:
vector<vector<int>> findFarmland(vector<vector<int>>& land) {
m = land.size();
n = land[0].size();
vector<vector<int>> ans;
for(int i = 0; i < m; ++i){
for(int j=0; j < n; ++j){
if(land[i][j]){
r1 = i;
c1 = j;
r2 = i;
c2 = j;
dfs(land, i, j, r2, c2);
ans.push_back({r1, c1, r2, c2});
}
}
}
return ans;
}
};
- 1、dfs染色问题。