【Java实现】剑指Offer26——树的子结构:思路分享(类比树的对称)

图片来自LeetCode
同学们,我把《剑指Offer》中所有“树”标签的习题及思路整理出来了,对照学习效果更佳:


题目分析:

递归!递归!递归!遇到树的问题首先想到递归!

判断是不是子结构——就是要判断一棵树能否包含另一棵树——遍历两个树看是否一致

举个栗子:如图所示,给定两棵树:
图片自己画的

  • 首先判断根节点,也就是34,如果根节点相等,就继续同时遍历两棵树,看其他部分是否相同,我们把上述遍历来看是否完全相同的方法定义为recur
  • 如果根节点不同,则递归到主树的左右子节点,也就是45,分别判断这两个值和目标根节点是否相等,如果不相等再继续递归
  • 此时我们发现4和目标根节点相同,则继续recur其左右子节点即可
  • recur函数用来判断从一个点出发能否完全匹配
  • isSub函数用来递归判断是不是左右子树的子结构

通俗来讲,给定两个点,先判断这两个点能否匹配(recur),如果不能,再判断左右子树能够匹配,这三个结果有一个是true就可以

难点分析:什么时候跳出recur()方法?

  • 如果B树走到头,为null时,就返回true,此时A树有两种情况:空或不为空,无论那种情况,都说明完全匹配
  • else,如果B不为空,此时还是两种情况:A空,则说明没有完全匹配;A不空,则需要判断两个节点的值
  • 若都满足,则进入子节点的比较,及分别比较左子节点和右子节点,都true才返回true

这道题类比《对称的二叉树》:判断对称的要求是完全一样,因此需要A==null && B==null,但是这里判断子结构不能这样,当B==null时,说明判断完成,而如果不满足上一条直接A==null,则说明判断失败

代码如下:

class Solution {
    public boolean isSubStructure(TreeNode A, TreeNode B) {
        if(A==null || B==null) return false;
        return  (recur(A,B) || isSubStructure(A.left,B) || isSubStructure(A.right,B));
    }
    private boolean recur(TreeNode A,TreeNode B) {
        if(B==null) {
            return true;
        }
        if(A==null || (A.val != B.val)) {
            return false;
        }
        return recur(A.left,B.left) && recur(A.right,B.right);
    }
}

复杂度分析:

  • 时间复杂度:O(MN),因为首先要遍历主树M个节点,再去配对N个节点,因此是M*N
  • 空间复杂度:O(M),M为A的节点个数,因为总递归深度就是A的节点数目
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值