JZ17 树的子结构

描述

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

首先还是复习下树的概念

树包含node、edge、root。

节点(Node):树中的每一个数据元素成为一个节点,节点是树的基本构成部分。

边(Edge):边也是树的基本构成部分。边有方向,连接两个节点,并表示它们之间的联系。

根节点(Root):根节点是树中唯一一个没有入边的节点。

路径(Path):路径是由边连接起来的节点的有序排列。

子节点集(Children):当一个节点的入边来自另一个节点时,称前者是后者的子节点,同一个节点的所有子节点构成子节点集。

父节点(Parent):一个节点是它出边所连接的所有节点的父节点。

兄弟节点(Sibling):同一个节点的所有子节点互为兄弟节点。

子树(Subtree):子树是一个父节点的某个子节点的所有边和后代节点所构成的集合。

叶节点(Leaf Node):没有子节点的节点称为叶节点。

层数(Level):一个节点的层数是指从根节点到该节点的路径中的边的数目。

高度(Height):树的高度等于所有节点的层数的最大值。

Mooc的大学计算机-python算法实践中二叉树的实现。

 

 然后回到题目里面,讨论组题解:对于两颗二叉树来说,要判断树B是不是树A的子结果,首先第一步在树A中查找与B根节点的值一样的节点。第二步就是判断树A中以R(B根节点的值)为根节点的子树是不是和树B具有相同的结构。

递归的终止条件是我们达到了树A或者树B的叶节点。

有地方要重点注意,DoesTree1haveTree2()函数中的两个 if 判断语句不能颠倒顺序。

class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        result = False
        if pRoot1 != None and pRoot2 != None:
            if pRoot1.val == pRoot2.val:
                result = self.DoesTree1haveTree2(pRoot1, pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.left, pRoot2)
            if not result:
                result = self.HasSubtree(pRoot1.right, pRoot2)
        return result
    def DoesTree1haveTree2(self, pRoot1, pRoot2):
        if pRoot2 == None:
            return True
        if pRoot1 == None:
            return False
        if pRoot1.val != pRoot2.val:
            return False
        return self.DoesTree1haveTree2(pRoot1.left, pRoot2.left) and self.DoesTree1haveTree2(pRoot1.right, pRoot2.right)

这里的DoesTree1haveTree2()函数中第一句if语句我有疑问,pRoot2等于None的时候,返回的是True。

解释是为了看看子结构是否遍历完(这道题还是不理解,多做几个树的题目再回来看)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值