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

文章目录



题目

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


一、思路

在树中寻找子树,从直观思维的角度来看,应该是先寻找相同的根节点,如果有相同的根节点,再去比较下面的结构。
因此可以分两个部分:
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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值