题目:输入两棵二叉树A和B,判断B是不是A的子结构。
public class wr18hasSubTree { // 第一步:在树A中查找与根节点的值一样的结点 public boolean HasSubtree(TreeNode root1,TreeNode root2) { boolean result=false; // 当tree1和tree2都不为0的时候才进行比较,否则直接返回false if(root2!=null && root1!=null){ // 如果找到了对应tree2的根节点的点,以这个根节点为起点判断是否包含tree2 if(root1.val==root2.val){ result=doesTree1HaveTree2(root1,root2); } // 如果找不到,root左儿子当起点,判断是否包含tree2 if(!result){ result=HasSubtree(root1.left,root2); } // 如果还找不到,root右儿子当做起点 if(!result){ result=HasSubtree(root1.right,root2); } } return result; } // 第二步,判断树A中以R为根节点的子树是不是和树B具有相同的结构 // 思路:如果结点R的值和树B的根节点不同,则以R为根节点的子树和树B肯定不具有相同的结点 // 如果他们的值相同,则递归判断他们各自的左右结点的值是不是相同 // 递归的终止条件是我们到达了树A或者树B的叶子结点 public static boolean doesTree1HaveTree2(TreeNode node1,TreeNode node2){ if(node2==null){ return true; } if(node1==null){ return false; } if(node1.val!=node2.val){ return false; } return doesTree1HaveTree2(node1.left,node2.left)&&doesTree1HaveTree2(node1.right,node2.right); } }