剑指offer(十七)数的子结构

  • 题目

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

    • 输入:{8,8,7,9,2,#,#,#,#,4,7},{8,9,2}
    • 输出:true
  • 分析

    • 需要一个个去遍历节点,如果当前节点的值等于B节点的根节点的值
    • 那就从此节点开始,遍历其和B链表的所有节点
    • 如果不符合,则继续往下遍历A链表
  • 解题代码

/**
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) {

        // 判断是否是空结构
        if(root1 == null || root2 == null) return false;

        boolean flag = topCompare(root1, root2);

        if(!flag)
        {
            return HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2);
        }

        return flag;

    }

    // 判断从根节点开始是否相等
    private boolean topCompare(TreeNode root1, TreeNode root2)
    {
        //必须放在下一行代码前面,因为两者同时为null的时候,其实是成功的
        if(root2 == null) return true;
        if(root1 == null) return false;

        if( root1.val == root2.val )
        {
            return topCompare(root1.left, root2.left) 
                && topCompare(root1.right, root2.right);
        } else {
            return false;
        }

    }
}
  • 总结
    • 这种寻找子结构的让我想到了在字符串中寻找是否包含子字符串的情况
    • 正常情况下,是需要一个个字符遍历,一旦第一个和子串第一个相等的时候,然后开始比较往后的字符串是否相等,时间复杂度为O(mn)
    • 但是看到一个算法,KMP算法,经过其优化之后,时间复杂度可缩短至O(m+n)
    • KMP算法详情:字符串匹配的KMP算法
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值