题目来源于知识星球—英雄算法联盟,七月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、958.二叉树的完全性检验(中等)
1.题目描述
2.解题思路
完全二叉树按照层序遍历对接点进行编号,从1开始,如果根节点的编号为a,
那么它的左子树编号为2*a,右子树编号为2*a+1,遍历之后,如果中间有编
号的空缺,则不符题意。
3.代码演示(C++)
class Solution
{
int hash[200];
bool flag;
void dfs(TreeNode* root, int p)
{
if(!root)
{
return ;
}
if(p >= 200)
{
flag = true;
return ;
}
hash[p] = 1;
dfs(root->left, p<<1);//左子树节点编号*2
dfs(root->right, p<<1|1);//右子树节点编号*2+1
}
public:
bool isCompleteTree(TreeNode* root)
{
flag = false;
dfs(root, 1);
if(flag)
{
return false;
}
for(int i = 1; i < 200; ++i)
{
if(!hash[i])
{
for(int j = i+1; j < 200; ++j)
{
if(hash[j])
{
return false;
}
}
}
}
return true;
}
};
4.题目链接
二、剑指 Offer 26.树的子结构(中等)
1.题目描述
2.解题思路
判断B是否为A的子结构。
A、B都为空时,返回true;
A空,B不空时,返回false;
A不空,B空时,返回true;
A的值与B的值不同,返回false;
A的左子树与B的左子树比较,A的右子树与B的右子树比较;
最后依次遍历每个节点。
3.代码演示(C++)
class Solution
{
bool isSub(TreeNode* A, TreeNode* B)
{
if(!A && !B)
{
return true;
}
if(A && !B)
{
return true;
}
if(!A && B)
{
return false;
}
if(A->val != B->val)
{
return false;
}
return isSub(A->left, B->left) && isSub(A->right, B->right);
}
public:
bool isSubStructure(TreeNode* A, TreeNode* B)
{
if(B == NULL)
{
return false;
}
if(isSub(A, B))
{
return true;
}
if(A == NULL)
{
return false;
}
return isSubStructure(A->left, B) || isSubStructure(A->right, B);
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!