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的逻辑发现无法实现