剑指 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;
    }
原文地址:https://www.cnblogs.com/peanut-zh/p/14134543.html