思路1:采用递归的想法对比pRoot2是否是pRoot1的子结构,判断当前根结点的值是否相同,进而往左子树判断,以及右子树,同时都相同则是子结构(没有左右子树默认相同),主函数就有3种情况,1.子结构就在当前根结点,2.子结构在当前根结点的左子树中,3.子结构在当前根结点的右子树中,如果都没有则返回false
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
bool isTheSame(TreeNode* pRoot1,TreeNode* pRoot2)
{
bool left=true;
bool right=true;
if(!pRoot1||!pRoot2||pRoot1->val!=pRoot2->val)
return false;
if(pRoot2->left)
left=isTheSame(pRoot1->left, pRoot2->left);
if(pRoot2->right)
right=isTheSame(pRoot1->right, pRoot2->right);
return left&&right;
}
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
if(!pRoot1||!pRoot2)
return false;
if(isTheSame(pRoot1, pRoot2))
return true;
if(HasSubtree(pRoot1->left, pRoot2)||HasSubtree(pRoot1->right, pRoot2))
return true;
else
return false;
}
};