牛客剑指JZ26——树的子结构

题目描述
https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88

思路:树A和树B比较,如果其中一个是空树,那就不存在是不是A的一部分了,可以直接返回false;
以节点root1开始比较和B是不是相同,再递归比较是不是root1的左子树的一部分,再递归比较是不是右子树的一部分

fun函数进行比较A和B,如果树A为空而树B不为空,说明匹配失败返回false
如果B空了,那说明已经匹配完了,返回true
如果节点值不同,说明不匹配,返回true
如果节点值相同,在比较两棵树的左子和右子是不是相同。

注意区别:HasSubtree函数是判断是不是一部分
fun函数时判断是不是相同的两棵树

/**
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }

}
*/
// 思路:先找到树A和B相同的结点,在判断以树A中r结点为根的子树是不是包含B
public class Solution {
    public boolean HasSubtree(TreeNode root1,TreeNode root2){
        // 有一个树是空数都不是子树
        if(root1==null || root2==null)
        return false;

        // 比较看是不是相同的
        boolean flag1=fun(root1,root2);
        // 递归看是不是左子树的一部分
        boolean flag2=HasSubtree(root1.left,root2);
        // 递归看是不是右子树的一部分
        boolean flag3=HasSubtree(root1.right,root2);
        return flag1||flag2||flag3;
    }
    boolean fun(TreeNode root1,TreeNode root2){
        if(root1==null && root2!=null) return false;
        if(root2==null) return true;// 说明小树已经匹配完了,要放在val比较的前面,否则会报错
        if(root1.val!=root2.val) return false;
         // 递归匹配左子和右子
        return fun(root1.right,root2.right) &&fun(root1.left,root2.left);
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值