剑指Offer——题26(树的子结构)

本文介绍了一种算法,用于判断一棵二叉树是否包含另一棵二叉树作为其子结构。通过遍历主树并比较子树,利用深度优先搜索实现。特别地,文章详细解释了如何正确处理浮点数的比较,避免了直接使用==操作符可能导致的误差。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【题目】:

输入两棵二叉树A和B,判断B是不是A的子结构

【思路】:

1)先对A树进行遍历,找到与B树的根结点值相同的结点R;

2)判断A树中以R为根结点的子树是否包含B树一样的结构。

【注意】:

判断浮点数相等不能直接用 “==“ 判断。

package com.offer.offer26;

/**
 * @author zth
 * @Date 2019-08-13 10:38
 */
public class SubstructureInTree {
    public static class TreeNode{
        double val;
        TreeNode left = null;
        TreeNode right =null;
        public TreeNode(double val) {
            this.val=val;
        }
    }

    public static boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean res = false;
        if (null!= root1 && null != root2){
            if (equal(root1.val,root2.val)){
                res = doesTree1HaveTree2(root1,root2);
            }
            if (!res){
                res = HasSubtree(root1.left,root2);
            }
            if (!res){
                res = HasSubtree(root1.right,root2);
            }
        }
        return res;
    }

    /**
     * 判断树中以 root1 为根节点 和 子结构的根节点相等时,是否包含子结构
     * @param root1 树中节点
     * @param root2 子结构中的节点
     * @return 包含返回 true,否则返回 false
     */
    private static boolean doesTree1HaveTree2(TreeNode root1,TreeNode root2 ){
        if (root2 == null){
            return true;
        }
        if (root1 == null){
            return false;
        }
        if (!equal(root1.val,root2.val)){
            return false;
        }

        return doesTree1HaveTree2(root1.left,root2.left) && doesTree1HaveTree2(root1.right,root2.right);

    }

    /**
     * 判断两个 double 值是否相等
     * 由于浮点数不是精确数值,判断相等不能直接用 ==
     * 当两个数的绝对值足够小时,比如 小于0.0000000000001 认为他们是相等的
     * @return 相等返回 true,否则返回false
     */
    private static boolean equal(double num1,double num2){
        if ((num1-num2>-0.0000001) && (num1-num2<0.0000001) ){
            return true;
        }else{
            return false;
        }
    }
    public static void main(String[] args){
        TreeNode node1 = new TreeNode(1.1);
        TreeNode node2 = new TreeNode(1.2);
        TreeNode node3 = new TreeNode(1.3);

        node1.left = node2;
        node1.right = node3;

        boolean res = HasSubtree(node1,node3);
        System.out.println(res);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值