剑指offer算法题:树的子结构HasSubtree

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

public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        boolean result = false;
        if(root1 != null && root2 != null) {
            if(root1.val == root2.val) 
                result = DoseAHasB(root1,root2);//判断A、B子结构
            if(!result)
                result = HasSubtree(root1.left,root2);//继续判断下面的节点
            if(!result)
                result = HasSubtree(root1.right,root2);//继续判断下面的节点
        }
        return result;
    }
    private boolean DoseAHasB(TreeNode root1,TreeNode root2) {
        if(root2 == null)//说明B子树的结构都判断完并都与A相等
            return true;
        if(root1 == null)//B还没判断完A就结束了
            return false;
        if(root1.val != root2.val)
            return false;
        return DoseAHasB(root1.left,root2.left) && DoseAHasB(root1.right,root2.right);
    }

层次遍历版:

public boolean HasSubtree(TreeNode root1,TreeNode root2) {
        if(root1 == null || root2 == null)
            return false;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root1);
        while(!q.isEmpty()) {
           TreeNode node = q.poll();
            if(node.left != null)
                q.offer(node.left);
            if(node.right != null)
                q.offer(node.right);
            if(node.val == root2.val) {
                boolean result = DoseAhasB(node,root2);
                if(result == true)
                    return true;
            }
        }
        return false;
    }
    private boolean DoseAhasB(TreeNode n1,TreeNode n2) {
        if(n2 == null) return true;
        if(n1 == null)return false;
        if(n1.val != n2.val)return false;
        return DoseAhasB(n1.left,n2.left) && DoseAhasB(n1.right,n2.right);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值