package cn.dzp.flyroc.offer; public class HasSubTreeDemo { /* 题目描述:输入两颗二叉树A,B。 判断B是否是A的子结构。(约定空树不是任何一个树的子结构)*/ /* 思路:若根节点相同,利用递归比较他们的子树是否相同; 若根节点不一样,则利用递归分别在左右子树中查找。*/ //代码实现 static class TreeNode { //构建TreeNode类 int val; //节点值 TreeNode left; //构建左子树 TreeNode right; //构建右子树 //构造函数 TreeNode(int val) { this.val = val; } } //判断A,B两树的根节点是否相同 public boolean rootEquire(TreeNode rootA, TreeNode rootB){ //定义一个初始标记 boolean result = false; //判断A,B两树是否为空 if (rootA != null && rootB != null){ //判断A,B两树的根节点值是否相等 if (rootA.val == rootB.val){ //以A树的根节点为起点,与B树一一比较 result = nodeEquire(rootA,rootB); } //若是A,B两树的根节点不一样,就去A树的左右子树找是否有与B树相同的结构 if (!result){ return rootEquire(rootA.left ,rootB) || rootEquire(rootA.left ,rootB); } } System.out.println("B树不是A树的子树"); return result; } //判断A,B两树的子树是否相同 public static boolean nodeEquire(TreeNode nodeA, TreeNode nodeB) { //treeB全度遍历完了,且一一对应 if (nodeB == null){ System.out.println("B数是A数的子树"); return true; } //treeA全都遍历完,treeB还没遍历完 if (nodeA == null){ System.out.println("B树不是A树的子树"); return false; } //若是某处的节点值不一样 if (nodeA.val != nodeB.val){ System.out.println("B树不是A树的子树"); return false; } //若是根节点对应上,就去子树中匹配 return nodeEquire(nodeA.left,nodeB.left) && nodeEquire(nodeA.right, nodeB.right); } }