剑指offer实践 ——26.树的子结构(python版)

本文介绍了如何使用Python实现一个二叉树子结构查找算法,通过递归比较根节点和其对应结构,判断两个树是否为子结构。关键步骤包括检查根节点是否相同,然后递归检查左右子树。示例代码展示了如何在给定的二叉树中搜索特定的子树结构。

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

文章目录



题目

树的子结构
在这里插入图片描述


一、思路

在树中寻找子树,从直观思维的角度来看,应该是先寻找相同的根节点,如果有相同的根节点,再去比较下面的结构。
因此可以分两个部分:
1.树中是否有相同的根节点R
2.R对应的结构与子树是否相同

class Binary_Tree():

    def __init__(self, var=None, left=None, right=None):
        self.var = var
        self.left = left
        self.right = right

一、树中是否有相同的根节点R
从根节点开始递归比较

def is_same_root(treeA, treeB):
    if not treeA or not treeB:
        return False
    if treeA.var == treeB.var:
        res = is_sub_tree(treeA, treeB)
    # 当前根节点对比后没有找到子结构,寻找当前左节点是否含有子结构
    if not res and treeA.left:
        res = is_sub_tree(treeA.left, treeB)
    # 当前根节点左节点对比后没有都找到子结构,寻找当前右节点是否含有子结构
    if not res and treeA.right:
        res = is_sub_tree(treeA.right, treeB)
    return res

二.R对应的结构与子树是否相同

def is_sub_tree(treeA, treeB):
    # 如果当前的子树已经没有结构了,返回相同
    if not treeB:
        return True
    # 如果当前的树已经没有结构了,子树还有,返回没有相同结构
    if not treeA:
        return False
    if treeA.var == treeB.var:
        return is_sub_tree(treeA.left, treeB.left) and is_sub_tree(treeA.right, treeB.right)
if __name__ == '__main__':
    root = Binary_Tree(root=8)
    root_left = Binary_Tree(root=8)
    root.left = root_left
    root_right = Binary_Tree(root=7)
    root.right = root_right

    root_left_left = Binary_Tree(root=9)
    root_left_right = Binary_Tree(root=2)
    root_left.left = root_left_left
    root_left.right = root_left_right

    root_left_right_left = Binary_Tree(root=4)
    root_left_right_right = Binary_Tree(root=7)
    root_left_right.left = root_left_right_left
    root_left_right.right = root_left_right_right


    sub_root = Binary_Tree(root=8)
    sub_left = Binary_Tree(root=9)
    sub_right = Binary_Tree(root=2)
    sub_root.left = sub_left
    sub_root.right = sub_right


    r1 = is_same_root(root, sub_root)
    print(r1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值