题目来源于知识星球—英雄算法联盟,七月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、2331.计算布尔二叉树的值(简单)
1.题目描述
2.解题思路
本题采用递归的思想,先判断是否为叶子结点,然后返回值;其次判断非叶子节点,
判断它的值为2还是3,再进行相关的计算即可。
3.代码演示(C++)
class Solution
{
bool isLeaf(TreeNode *root)
{
return (!root->left)&&(!root->right);
}
public:
bool evaluateTree(TreeNode* root)
{
if(isLeaf(root))
{
return root->val;
}
if(root->val==2)
{
int ans=0;
if(root->left)
{
ans|=evaluateTree(root->left);
}
if(root->right)
{
ans|=evaluateTree(root->right);
}
return ans;
}
int ans=1;
if(root->left)
{
ans&=evaluateTree(root->left);
}
if(root->right)
{
ans&=evaluateTree(root->right);
}
return ans;
}
};
4.题目链接
二、951.翻转等价二叉树(中等)
1.题目描述
2.解题思路
题中翻转的意思就是随机选择一个节点,交换它的左右子树。
1.如果两棵二叉树都为空树,返回true;
2.如果两棵二叉树一个为空树,另一个不为空,返回false;
3.如果两棵二叉树都不为空树,那么比较这两个根节点的值,不相等则返回false;
4.如果这两棵二叉树根节点的值相等,就递归判断它们的左右子树,左子树与左子
树,右子树与右子树比较或者左子树与右子树,右子树与左子树比较。
3.代码演示(C++)
class Solution
{
public:
bool flipEquiv(TreeNode* root1, TreeNode* root2)
{
if(root1==NULL&&root2==NULL)
{
return true;
}
if(root1!=NULL&&root2==NULL)
{
return false;
}
if(root1==NULL&&root2!=NULL)
{
return false;
}
if(root1->val!=root2->val)
{
return false;
}
if((flipEquiv(root1->left,root2->left))&&(flipEquiv(root1->right,root2->right)))
{
return true;
}
if((flipEquiv(root1->left,root2->right))&&(flipEquiv(root1->right,root2->left)))
{
return true;
}
return false;
}
};
4.题目链接
三、1992.找到所有的农场组(中等)
1.题目描述
2.解题思路
看着题解敲得,其实题意很简单,就是把给出的二维数组中全是数字1的矩形
找到它的左上角和右下角的下标返回,满足条件的矩形之间的元素不能紧挨
着即可。
3.代码演示(C++)
class Solution
{
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(vector<vector<int>>&land,int m,int n,int z,int y,int &zmax,int &ymax )
{
if(!land[z][y])
{
return;
}
land[z][y]=0;
zmax=max(zmax,z);
ymax=max(ymax,y);
for(int i=0;i<4;i++)
{
int tz=z+dir[i][0];
int ty=y+dir[i][1];
if(tz<0||tz>=m||ty<0||ty>=n)
{
continue;
}
dfs(land,m,n,tz,ty,zmax,ymax);
}
}
public:
vector<vector<int>> findFarmland(vector<vector<int>>& land)
{
vector<vector<int>>ans;
int m=land.size();
int n=land[0].size();
int z1,y1,z2,y2;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(land[i][j])
{
z1=z2=i;
y1=y2=j;
dfs(land,m,n,i,j,z2,y2);
ans.push_back({z1,y1,z2,y2});
}
}
}
return ans;
}
};
4.题目链接
四、652.寻找重复的子树(中等)
1.题目描述
2.解题思路
下次再战!
3.代码演示(C++)
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!