涉及到两个迭代,分别树匹配树起点的迭代,以及匹配树和待匹配树的同步递归

/*
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 == nullptr) {
        return false;
      }
      if (pRoot1 == nullptr && pRoot2) {
        return false;
      }
      
      //  以当前起点进行进一步递归匹配
      bool flag1 = recursion(pRoot1, pRoot2);
      //  比较左子树和右子树,左右子树又是一颗独立的树
      //  以每个节点作为起点,进行每一轮的匹配
      bool flag2 = HasSubtree(pRoot1->left, pRoot2);
      bool flag3 = HasSubtree(pRoot1->right, pRoot2);
      
      return flag1 || flag2 || flag3;
    }
  private:
    bool recursion(TreeNode *root1, TreeNode *root2) {
      //  待匹配树不为空
      if (root1 == nullptr && root2) {
        return false;
      }
      
      //  待匹配树匹配到空成功,此时匹配树可空可不空
      if (root1 == nullptr || root2 == nullptr) {
        return true;
      }
      
      //  两个都有值,匹配是否相等
      if (root1->val != root2->val) {
        return false;
      }
      
      //  匹配一个成功,寻找下一个匹配
      return recursion(root1->left, root2->left) && recursion(root1->right, root2->right);
    }
};