• 思路:
    先从根开始再把左作为根,再把右作为根由本函数决定。把一个为根的时候的具体比对过程是第二个函数决定。
    从根可以认为是一颗树,从左子树开始又可以认为是另外一颗树,从右子树开始又是另外一棵树。
    本函数就是判断这一整颗树包不包含树2,如果从根开始的不包含,就从左子树作为根节点开始判断,再不包含从右子树作为根节点开始判断。

      public class TreeNode{
          int value;
          TreeNode left;
          TreeNode right;
    
          public TreeNode(int val){
              this.value=val;
          }
      }
      //先从根开始再把左作为根,再把右作为根由本函数决定。把一个为根的时候的具体比对过程是第二个函数决定。
      //从根可以认为是一颗树,从左子树开始又可以认为是另外一颗树,从右子树开始又是另外一棵树。
      //本函数就是判断这一整颗树包不包含树2,如果从根开始的不包含,就从左子树作为根节点开始判断,
      //再不包含从右子树作为根节点开始判断。
      //是整体算法递归流程控制。
      public static boolean HasSubtree(TreeNode root1,TreeNode root2){
           if(root1==null || root2==null){
               return false;
           }
           return check(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2);
      }
    
      //本函数,判断从当前的节点 ,开始两个树能不能对应上,是具体的比对过程
      public static boolean check(TreeNode root1,TreeNode root2){
          if(root2==null) {
              return true;
          }
          if(root1==null || root1.value!=root2.value){
              return false;
          }//如果根节点可以对应上,那么就去分别比对左子树和右子树是否对应上
          return check(root1.left,root2.left)&&check(root1.right,root2.right);
      }