17 树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
要查找树A 是否存再和树B一样的子树,我们可以分为2步:
1 遍历树A 找到与B根节点相同的节点R
2 判断以R为根节点 构成的树 与树B是否相同,递归的去做,先判断根节点是否相同,再判断左右节点是否相同,终止条件是,R或B遍历到叶子节点。
1 遍历树A 找到与B根节点相同的节点R
2 判断以R为根节点 构成的树 与树B是否相同,递归的去做,先判断根节点是否相同,再判断左右节点是否相同,终止条件是,R或B遍历到叶子节点。
1 public class Solution { 2 public boolean HasSubtree(TreeNode root1,TreeNode root2) { 3 boolean res =false; 4 if(root1!=null && root2!=null){//边界条件 5 if(root1.val==root2.val) 6 //判断子树是否相同 7 res = Tree1HaveTree2(root1,root2); 8 if(!res) 9 res = HasSubtree(root1.left, root2); 10 if(!res) 11 res = HasSubtree(root1.right, root2); 12 } 13 return res; 14 15 } 16 private boolean Tree1HaveTree2(TreeNode root1,TreeNode root2){、 17 //边界条件 18 if(root2==null) return true;//树B已经遍历完,说明B是A的子树 19 if(root1==null) return false;//如果A遍历完了,B没遍历完,肯定不是子树 20 21 if(root1.val!= root2.val) return false;//根节点不同 更不是了 22 return Tree1HaveTree2(root1.left,root2.left) &&Tree1HaveTree2(root1.right,root2.right); 23 } 24 }