《剑指Offer》-- 树的子结构(Python)

该博客主要探讨如何解决《剑指Offer》中关于判断一棵树是否为另一棵树的子结构的问题。通过递归遍历树的节点,首先找到与B根节点值相同的节点,然后判断以该节点为根的子树是否与B树结构相同。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

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

思路

看题目明显知道是遍历树的任务,而且遍历树应该第一时间反应出来的应该是递归实现遍历树

题目是判断树B是否是树A的子结构,分两步走:

第一步,首先从上往下遍历寻找A,判断A是否存在于B根节点值R相同的节点

第二步,判断在树A中以R为根节点的子树是否与树B具有相同的结构

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


def HasSubtree(p1, p2):
    
    if not p1 or not p2:
        return False
    
    result = False

    # 第一步,在树A中查找与树B根节点的值相等的节点,如果当前节点不相等,则左右节点递归查找
    if p1.val == p2.val:
        
        # 第二步,判断树A中以R为根节点的子树是否与树B具有相同的结构
        result  = is_Subtree(p1, p2)

    if not result:
        result = HasSubtree(p1.left, p2)
    if not result:
        result = HasSubtree(p1.right, p2)
    
    return result



def is_Subtree(p1, p2):
    
    if not p2:        # 递归遍历完树B都没有返回False的话,说明树B是树A的以R为根节点的子树
        return True
    
    if not p1 or p1.val != p2.val:    # 树B还没遍历完,树A已经遍历完说明不是子树
        return False                  # 树B某节点的值与树A对应节点的值不等,说明不是子树
   
    # 递归判断树的左右节点是否都相等
    return is_Subtree(p1.left, p2.left) and is_Subtree(p1.right, p2.right)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值