代码注释详解 判断是否是子树 剑指Offer26. 树的子结构


剑指Offer26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)

B是A的子结构, 即 A中有出现和B相同的结构和节点值。

例如:
给定的树 A:

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/shu-de-zi-jie-gou-lcof

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        //思路:(假设节点的value可能存在相同的情况)
        //1. 遍历A找到B的根,找到之后同时遍历A和B,,
        //2. 如果一样则返回true,跳到4
        //3. 不一样,返回1
        //4. 返回结果
        if (A == null || B == null) return false;

        if (A.val == B.val){//先判断A的根是不是B的根
            if (isSubTree(A,B))
                return true;
        }
        //如果A的根不是B的根,在对左右子树进行判断
        boolean isLeft = isSubStructure(A.left,B);
        boolean isRight = isSubStructure(A.right,B);        

        return isLeft || isRight; //只要左右子树有一个匹配就算匹配成功
    }

    private boolean isSubTree(TreeNode A, TreeNode B){//判断B是不是A的子树
        if (A == null && B != null) return false;// 当B不空时,A肯定不能空,否则B就不是A的子树
        
        if (A.val == B.val){//条件1:A和B节点的值的相等
            boolean subLeft = true;//注意,初始为true,即若B没有左子树不管A有没有B都是A的子树
            if (B.left != null){//条件2:如果B的左子树存在,递归左子树
                subLeft = isSubTree(A.left,B.left);
            }
            boolean subRight = true;//条件3:右子树同理
            if (B.right != null){
                subRight = isSubTree(A.right,B.right);
            }
            return subLeft && subRight;//必须同时满足条件1、2、3 才能保证B是A的子树
        } 
        return false; // A.val != B.val
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值