前言
坚持下去,虽然不知道能否成功,不过畏首畏尾终究难成大器!!!
一、题目描述
二、详细题解描述
- 第一步,大思路是将主树的每个节点作为根节点,再和子树比较一下,看看符不符合子结构的特点,要是符合,就直接返回true,不符合的话,再分别让根节点的左右节点作为根节点和子树比较,直到根为空就返回false;
- 然后是自己搞一个函数,里面实现两棵树是否从根节点开始,子树和主树是否有子结构的特点;主要是主树要和子树的每一个节点都要有相同的节点,有一个节点和子树不相等就不是子结构;
- 用递归分治思想,看根节点作为根开始和子树是否匹配子结构,要是匹配就返回true,要是不匹配,就让左右节点作为根再次比较;递归下去;
三. 代码实现
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param pRoot1 TreeNode类
* @param pRoot2 TreeNode类
* @return bool布尔型
*/
bool Issametree(struct TreeNode* n1,struct TreeNode* n2){
if(n2==NULL)
return true;
if(n1==NULL&&n2!=NULL)1
return false;
if(n1->val!=n2->val)
return false;
return Issametree(n1->left , n2->left) && Issametree(n1->right,n2->right);
}
bool HasSubtree(struct TreeNode* pRoot1, struct TreeNode* pRoot2 ) {
// if(pRoot2==NULL)
// return false;
// write code here
if(pRoot1==NULL)
return false;
if(pRoot2==NULL)
return false;
if(Issametree(pRoot1,pRoot2))
return true;
return HasSubtree(pRoot1->left, pRoot2)||HasSubtree(pRoot1->right,pRoot2);
}
总结
有空刷题还是挺不错的,有时间试一下!!!