Tree-017-树的子结构

题目

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

基础知识

子树的意思是包含了一个节点,就得包含这个节点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个节点为根的子树。
子结构的意思是包含了一个节点,可以只取左孩子和右孩子 而不是左子树右子树
例子:
在这里插入图片描述
在这里插入图片描述
建树是层次遍历
根据测试用例来看 应该是必须有左右孩子 不能只匹配到一个

思路

主函数 用于找到子结构的根节点
写个judge 函数 用于遍历判断每个节点都相等

代码

public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 ==null){
            //如果有一个为空 则没有匹配到 无相同根节点
            return false;
        }
        if(root1.val == root2.val){
            if(judge(root1,root2))
                return true;
        }
        //遍历左子树 或者右子树
        return HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);
        
    }
    public boolean judge(TreeNode root,TreeNode subtree){
        //表明匹配完毕,先判断子树 再判断树 排除了两树同时到达空 被误判的情况
        if(subtree == null){
            return true;
        }
        //大树先为空 没有匹配到
        if(root == null){
            return false;
        }
        if(root.val == subtree.val){
          return judge(root.left,subtree.left)&&judge(root.right,subtree.right);
            
        }
        //不相等就说明没有匹配到 返回false
        return false;
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值