剑指offer之面试题18:树的子结构

本文介绍了一种通过递归遍历的方法来判断一棵二叉树是否为另一棵二叉树的子结构。该方法首先检查两棵树的根节点是否相同,如果相同则递归比较左右子树;如果不相同,则继续遍历第一棵树的左子树和右子树。

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

题目描述

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

思路:二叉树的遍历&递归。
判断A的根节点和B的根节点是否相等:相等,递归判断A的左右子树是否和B的左右子树相等。若不相等,遍历到A的左子树根节点,同样的方法判断根节点是否相等…,遍历到A的右子树根节点,判断右子树根节点是否和B根节点相等。
代码如下:

/**
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) {
        //判断B是不是A的子结构,即判断B中对应的值是否与A中对应的值完全相等
        //二叉树遍历&递归的思想:
        //1:遍历到根节点,判断根节点是否相等,然后递归判断左右子树是否相等
        //2:如果根节点不相等,遍历到左子树的根节点
        //3:如果左子树不想等,遍历到右子树的根节点
        boolean hasSubtree=false;
        if(root1!=null&&root2!=null){
            if(root1.val==root2.val)
                hasSubtree=nodesValEqual(root1,root2);
            if(!hasSubtree)
                hasSubtree=nodesValEqual(root1.left,root2);
            if(!hasSubtree)
                hasSubtree=nodesValEqual(root1.right,root2);
        }
        return hasSubtree;
    }

    public boolean nodesValEqual(TreeNode root1,TreeNode root2){
        if(root2==null)
            return true;
        if(root1==null)
            return false;
        if(root1.val!=root2.val)
            return false;
        return nodesValEqual(root1.left,root2.left)&&nodesValEqual(root1.right,root2.right);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值