剑指offer 树的子结构

这道题本来写的代码很冗长,后来参考了别人写的代码精简了一下。总体思路就是先判断两个树是否为空树,如果为空,则直接返回False,如果不为空,那么就递归判断是否有子结构。
如果树2是树1的子结构,那么有三种情况,第一种是树1的根就是树2的根,然后左右子树也与树2的左右子树对应相等,也就是isSub(pRoot1, pRoot2),第二种是树2是树1的左子树的子结构,也就是self.HasSubtree(pRoot1.left, pRoot2),第三种是树2是树1的右子树的子结构,也就是self.HasSubtree(pRoot1.right, pRoot2)。如果不满足这三种情况中的任何一个,那么就说明树2不是树1的子结构。
接下来就是isSub函数的编写。采用递归的方式进行编写。如果root2指向的节点为空,那么无论root1指向的节点是否为空(由于初始时判断过两个树是否是空树,所以root1所在树一定不是空树,只是root1指向的节点为空),那么就说明root2所在树是root1所在树子结构。如果root2指向的节点非空,而root1指向节点为空,或者root1指向的值与root2指向的值不等,那么树2一定不是树1的子结构。之后就是递归判断root2的左子树是不是root1的的根节点值相同左子树的子结构,root2的右子树是不是root1的的根节点值相同右子树的子结构。只有左右子树都满足条件的时候,才返回True,否则返回False。

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:    
	# root2是否是root1的根节点值相同的子结构
    def isSub(self, root1, root2):
        if root2 is None:
            return True
        if root1 is None or root1.val != root2.val:
            return False
        return self.isSub(root1.left, root2.left) and self.isSub(root1.right, root2.right)
        
    # root2是否是root1的子结构
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if pRoot1 is None or pRoot2 is None:
            return False
        
        return self.isSub(pRoot1, pRoot2) or self.HasSubtree(pRoot1.left, pRoot2) or self.HasSubtree(pRoot1.right, pRoot2)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值