先在树A中找到值为树B根节点的值的节点,然后判断这个节点的子树是否含有和树B一样的结构。

  1. 第一步中,查找与根节点值一样的节点,采用递归的方法来遍历树。
  2. 第二步中,同样采用递归的方法,判断判断当前对应节点是否相同,然后递归判断左、右节点,递归终止条件是到达了叶节点。
class Solution {
    bool DoesTree1HaveTree2(TreeNode* pRoot1, TreeNode* pRoot2){
        if(pRoot2 == nullptr)
            return true;

        if(pRoot1 == nullptr)
            return false;

        if(!(pRoot1->val==pRoot2->val))
            return false;

        return DoesTree1HaveTree2(pRoot1->left, pRoot2->left) &&
        DoesTree1HaveTree2(pRoot1->right, pRoot2->right);
    }
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) {
        bool result = false;
        
        if(pRoot1 != nullptr && pRoot2 != nullptr)
        {
            if(pRoot1->val==pRoot2->val)
                result = DoesTree1HaveTree2(pRoot1, pRoot2);
            if(!result)
                result = HasSubtree(pRoot1->left, pRoot2);
            if(!result)
                result = HasSubtree(pRoot1->right, pRoot2);
        }
        
        return result;
    }
};