class Solution {
public:

	bool panduan(TreeNode* p1,TreeNode* p2){
		if(p1 == NULL && p2 != NULL) return false;  //主树先空不对
		if(p1 == NULL || p2 == NULL) return true;   //主树空或不空无所谓,只要子树该节点空了,就ok
		if(p1->val != p2->val) return false;  //两个都不空 值不一样返回false
		else return panduan(p1->left,p2->left) && panduan(p1->right,p2->right);  //值一样两个都往下判断,直到p2为空为止
	}

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
		if(pRoot1 == NULL || pRoot2 == NULL) return false; //只要有一个是空的,本次判断无需执行
		bool flag1 = panduan(pRoot1,pRoot2);  //去判断当前的两个节点
		bool flag2 = HasSubtree(pRoot1->left,pRoot2);  //如果flag1不成立,就去判断主树的左和右
		bool flag3 = HasSubtree(pRoot1->right,pRoot2);//相当于遍历了主树的每个节点,只要有一个情况的panduan是true,那结果就是true
		return flag1 || flag2 || flag3;
    }
};
//根据对称的二叉树那个题和结合本题答案来写的
//最初时候想的用递归去判断这个flag2和flag3的逻辑发现无法实现