剑指Offer--面试题18:数的子结构--Java实现

本文介绍了一种方法来判断一棵二叉树是否是另一棵二叉树的子结构。通过递归查找并对比节点值,实现对二叉树结构的有效匹配。

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

题目描述:
输入两颗二叉树A和B,判断B是不是A的子结构。

解题思路:
要查找树A中是否存在和树B结构一样的子树,我们可以分为两步:第一步在树A中找到和树B的根结点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和B一样的结构。

通常我们都会采用递归的方式,但是这里需要注意的检查边界条件,即空指针。

代码如下:

public class HasSubTreeTest {

    static class Node{
        int key;
        Node left;
        Node right;

        Node(int key){
            this.key = key;
        }
    }
    public static boolean hasSubTree(Node root1, Node root2){

        boolean result = false;

        if(root1 != null && root2 != null){
            result = doesTreeHaveTree2(root1, root2);

            if(!result){
                result = hasSubTree(root1.left, root2);
            }
            if(!result){
                result = hasSubTree(root1.right, root2);
            }
        }

        return result;
    }
    private static boolean doesTreeHaveTree2(Node root1, Node root2) {
        if(root2 == null){
            return true; 
        }

        if(root1 == null){
            return false;
        }

        if(root1.key != root2.key){
            return false;
        }

        return doesTreeHaveTree2(root1.left, root2.left) && doesTreeHaveTree2(root1.right, root2.right);
    }
    public static void main(String[] args) {

        Node root1 = new Node(8);
        Node node8 = new Node(8);
        Node node7 = new Node(7);

        root1.left = node8;
        root1.right = node7;

        Node node9 = new Node(9);
        node8.left = node9;

        Node node2 = new Node(2);
        node8.right = node2;

        Node node4 = new Node(4);
        Node node72 = new Node(7);
        node2.left = node4;
        node2.right = node72;


        Node root2 = new Node(8);
        Node node92 = new Node(9);
        Node node22 = new Node(2);

        root2.left = node92;
        root2.right = node22;

        System.out.println(hasSubTree(root1, root2));

    }

}

代码中的测试案列:
A:
这里写图片描述
B:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值