//遍历root1树的节点root,当节点值等于root2时
//判断root与root2是否相同
//判断root的左子节点与root2的左子节点
//有不等返回false
//递归判断root.left
//判断root的右子节点与root2的右子节点
//有不等返回false
//递归判断root.left

import java.util.*;

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1==null||root2==null){
            return false;
        }
        LinkedList<TreeNode> Nodearray = new LinkedList();
        LinkedList<TreeNode> Node = new LinkedList();
        Node.add(root1);
        //层序遍历原树
        while(Node.size()!=0){
            TreeNode node = Node.poll();
            Nodearray.add(node);
            if(node.left!=null){
                Node.add(node.left);
            }
            if(node.right!=null){
                Node.add(node.right);
            }
        }
        //逐个节点判断
        for(int i=0;i<Nodearray.size();i++){
                if(equalTree(Nodearray.get(i),root2)){
                    return true;
                }
        }
        return false;

        //遍历root1树的节点root,当节点值等于root2时
        //判断root与root2是否相同
        //判断root的左子节点与root2的左子节点
        //有不等返回false
        //递归判断root.left
        //判断root的右子节点与root2的右子节点
        //有不等返回false
        //递归判断root.left
    }

    public boolean equalTree(TreeNode root1,TreeNode root2){
        if(root1.val!=root2.val){
            return false;
        }

        if((root1.left!=null&&root2.left!=null)&&!equalTree(root1.left,root2.left)){
            //二者均有左子结构
            //同时如果左子节点结构不相同则直接返回false
            //否则判断右子结构的情况
                return false;
        }else if((root1.left==null&&root2.left!=null)){//当root1 无子结构时,若root2 有子结构则 返回false
            return false;
        }
        if((root1.right!=null&&root2.right!=null)&&!equalTree(root1.right,root2.right)){
                return false;
        }else if((root1.right==null&&root2.right!=null)){
            return false;
        }
        //子结构均相同返回true

        return true;
    }
}