剑指offer_面试题26 : 树的子结构( python实现)

博客介绍了如何使用Python判断两棵二叉树中是否存在子结构关系。通过定义二叉树节点类,创建函数检查A树中是否存在与B树根节点相同并结构一致的子树。文章提供了一组示例树的创建和测试,展示不同情况下子结构的判断结果。
摘要由CSDN通过智能技术生成

树的子结构( python实现)

一、题目描述

题目:树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。

二、解题思路

  暂略。(此处主要作为书中python实现补充)

三、代码实现

  这里,首先用 python 定义一个二叉树节点类,如下。

class BinaryTreeNode(object):
    def __init__(self, value = None, left = None, right = None):
        self.value = value
        self.left = left
        self.right = right

  这里开始本博客的最重要的部分。第一步定义一个函数,找到 A 树中,与B树根节点相同的节点;第二步判断该节点以下的结构是否存在与树 B 一致的结构。(若面试官没有特殊的要求,可以采用递归实现,代码更简洁,思路更清晰)

  首先定义一个判断Tree1中是否包含Tree2的函数,如下。

def theTree1HasTree2(pRoot1,pRoot2):
    if pRoot2 is None:
        return True
    if pRoot1 is None:
        return False
    if pRoot1.value != pRoot2.value:
        return False
    return theTree1HasTree2(pRoot1.left, pRoot2.left) and theTree1HasTree2(pRoot1.right,pRoot2.right)

  寻找 A 树中,与B树根节点相同的节点;然后利用上面定义好的 theTree1HasTree2() 判断是否满足包含关系。

def hasSubTree(pRoot1,pRoot2):
    result = False
    # 这里用if判断pRoot2是否为1个空节点,如果是,返回True
    if pRoot2.value is None and pRoot2.left is None and pRoot2.right is None:
        return True
        
    if pRoot1.value == pRoot2.value:
        result = theTree1HasTree2(pRoot1, pRoot2)
    if result is not True:
        result = theTree1HasTree2(pRoot1.left, pRoot2)
    if result is not True:
        result = theTree1HasTree2(pRoot1.right, pRoot2)
    return result

  以下采用比较直观的方式,对上述函数进行测试。首先,暴力生成一棵二叉树,这里只是为了测试,二叉树的相关定义及操作实现可参考:link(待添加)。

  暴力创建第一棵二叉树(Tree1),如下。

Tree1 = BinaryTreeNode(1)
Tree1.left = BinaryTreeNode(2)
Tree1.right = BinaryTreeNode(3)
Tree1.left.left = BinaryTreeNode(4)
Tree1.left.right = BinaryTreeNode(5)

  Tree1结构如下图。

Tree1

  暴力创建第二棵二叉树(Tree2),如下。

Tree2 = BinaryTreeNode(2)
Tree2.left = BinaryTreeNode(4)
Tree2.right = BinaryTreeNode(5)

  Tree2结构如下图。

Tree2

  有了以上Tree1 和Tree2,可以直接看出来,Tree2就是Tree1的子结构,我们这里用Tree1和Tree2来测试一下前面所实现的函数 hasSubTree()。

>>>  hasSubTree(Tree1,Tree2)
Out:
True

  若是对Tree2进行略微改动,将右子节点改为6,如下。

>>> Tree2.right = BinaryTreeNode(6)

  那么此时Tree1便不再包含Tree2了,即Tree2不再是Tree1d的子结构。

>>> hasSubTree(Tree1,Tree2)
Out:
False

  空节点默认为任意一棵树的子结构,如下。

>>> Tree3 = BinaryTreeNode()
>>> hasSubTree(Tree1,Tree3)
Out:
True
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值