剑指Offer:输入两棵二叉树A,B,判断B是不是A的子结构

题目描述:


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

 

递归求解:


本题采用递归的思想,若pRoot1和pRoot2都是空树,则不是任意一个树的子结构;依次递归地比较它们的左、右子树。递归函数的定义如下:

  1. f(T1,T2)=1,如果pRoot2待比较的节点为空说明子树中所有的节点已经进行了比较;
  2. f(T1,T2)=0,如果pRoot2待比较的节点不为空,但是pRoot1待比较的节点已经为空,说明此时不存在这样的子结构;
  3. f(T1,T2)=0,如果pRoot1和pRoot2待比较的节点都不为空,那么我们比较其值是否相等,不相等说明不存在这样的子结构;
  4. f(T1,T2)=f(T1.left, T2.left) && f(T1.right,T2.right),若值相等则分别递归比较(此时如果发现左子树结构不相等,则直接返回0,无需再比较右子树结构);

 

python代码:

class TreeNode:
    def __init__(self, x):
        self.val = x
        self.left = None
        self.right = None


class Solution:
    def __init__(self):
        self.ans = 0

    def similar(self, pRoot1, pRoot2):
        if not pRoot2:
            return 1
        elif not pRoot1:
            return 0
        elif pRoot1.val == pRoot2.val:
            left = self.similar(pRoot1.left, pRoot2.left)
            if left == 0:
                return 0

            right = self.similar(pRoot1.right, pRoot2.right)
            return left and right
        else:
            return 0

    def HasSubtree(self, pRoot1, pRoot2):
        if not pRoot1 or not pRoot2:
            return 0
        self.ans |= self.similar(pRoot1, pRoot2)

        if self.ans:
            return 1
        else:
            self.ans |= self.HasSubtree(pRoot1.left, pRoot2)
            self.ans |= self.HasSubtree(pRoot1.right, pRoot2)
            pass
        return self.ans

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值