思路:
先找到和B树的根节点的值相同的节点。然后再判断A左子树和右子树和B树的左右子树是否相同
class Solution {
public:
bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2)
{
if(pRoot1 == nullptr || pRoot2 == nullptr)
return false;
bool res = false;
if(checkEqual(pRoot1->val, pRoot2->val) )//找到A树中和B树根节点相同的节点
res = check(pRoot1, pRoot2);//判断剩余的子树是否相同
if(!res)//如果当前节点不是B树的根节点,就找左子树
res = HasSubtree(pRoot1->left, pRoot2);
if(!res)//同上,找右子树
res = HasSubtree(pRoot1->right, pRoot2);
return res;
}
//检查以proot1,proot2为根节点的树的结构是否相同
bool check(TreeNode* pRoot1, TreeNode* pRoot2)
{
bool res ;
if(pRoot2 == nullptr)
return true;
if(pRoot1 == nullptr)
return false;
if(!checkEqual(pRoot1->val, pRoot2->val))
return false;
res = check(pRoot1->left, pRoot2->left) &&
check(pRoot1->right, pRoot2->right);
return res;
}
bool checkEqual(double num1, double num2)
{
if(num1 - num2 >-1e-6 && num1 - num2 < 1e-6)
return true;
else
return false;
}
};