class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } import javax.swing.tree.TreeNode; /** * 目标: * 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) * <p> * 思路: * 1、遍历,从A树中找到跟B根节点相同的节点 * 找到: * 从该节点开始,看是否两棵树匹配 * 没找到: * 递归A树左节点 * 递归A树右节点 * <p> * 2、找到相同根节点之后, * 判断以该节点为根节点的子树是否跟B树完全匹配 * <p> * 3、默认返回false * <p> * 小结: */ public class Solution17 { public boolean HasSubtree(TreeNode root1, TreeNode root2) { //1、遍历,从A树中找到跟B根节点相同的节点 if (root1 == null || root2 == null) { return false; } boolean flag = false; // 2、找相同根节点 if (root1.val == root2.val) { // 2。1、找到,判断以该节点为根节点的子树是否跟B树完全匹配 flag = doesHasSubtree(root1, root2); } // 2。2、没找到,分别从左子树、右子树中找相同的根节点 if (!flag) { flag = HasSubtree(root1.left, root2); } if (!flag) { flag = HasSubtree(root1.right, root2); } // 3、默认返回false return flag; } public boolean doesHasSubtree(TreeNode root1, TreeNode root2) { if (root2 == null) { return true; } if (root1 == null || root1.val != root2.val) { return false; } return doesHasSubtree(root1.left, root2.left) && doesHasSubtree(root1.right, root2.right); } }