剑指 Offer 26. 树的子结构
/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if(root1 == null || root2 == null){ return false; } //先从根节点判断B是不是A的子结构,如果不是在分别从左右两个子树判断, //只要有一个为true,就说明B是A的子结构 return isSub(root1,root2) || HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2); } public boolean isSub(TreeNode a,TreeNode b){ //这里如果B为空,说明B已经访问完了,确定是A的子结构 if(b == null){ return true; } //如果B不为空A为空,或者这两个节点值不同,说明B树不是A的子结构,直接返回false if(a == null || a.val != b.val){ return false; } //当前节点比较完之后还要继续判断左右子节点 return isSub(a.left,b.left) && isSub(a.right,b.right); } }
剑指offer书上 和这里稍有一点不同,就是 树节点中值得类型不是int,是double,这样在比较的时候就不能简单的用 “==”,
这是因为计算机表示小数时有误差,判断相等,可以判断它们之差的绝对值是否在一个很小的范围内,若是,则认为它们相等。
boolean Equal(double num1,double num2){
if((num1 - num2 > -0.0000001)&&(num1 - num2 <0.0000001))
return true;
else
return false;
}