• a. 递归遍历左侧的树,若等于右侧树根节点,则进一步判断对应左右子树是否相等。
    返回值用或||,当有一个返回true时结束遍历。
  • b. 递归判断左右每一个节点是否相等,保持节点一致。
    返回值用&&,保持完全一致。注意:右侧为空时,应该返回true.
/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/
class Solution {
public:

    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        if(!pRoot2||!pRoot1) return false;
        if(pRoot1->val == pRoot2->val) //前序遍历验证
        {
//             coutval<<" \n";
            if(isSubTree(pRoot1,pRoot2))    //从相同位置开始判断
                return true;
        }
        return HasSubtree(pRoot1->left,pRoot2)|| 
            HasSubtree(pRoot1->right,pRoot2);
    }

    bool isSubTree(TreeNode* pRoot1, TreeNode* pRoot2)
    {
        // pRoot2等于空,说明左边完全匹配右边   
        if(!pRoot2)return true;
        // 左边为空 右边为空 false
        // 值不相等也 false
        if(!pRoot1 || pRoot1->val != pRoot2->val)return false;
        return isSubTree(pRoot1->left,pRoot2->left)&&
            isSubTree(pRoot1->right,pRoot2->right);
    }
};