树的子结构

题目描述:

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

代码实现:

# -*- coding:utf-8 -*-
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
class Solution:
    def HasSubtree(self, pRoot1, pRoot2):
        # write code here
        if pRoot1==None and pRoot2 == None:
            return False
        def subtree(pr1,pr2):
            if pr1==None and pr2==None:
                return True
            if pr1==None or pr2==None:
                return False
            if pr1.val==pr2.val:
                if pr2.left==None and pr2.right==None:
                    return True
                if subtree(pr1.left,pr2.left) and subtree(pr1.right,pr2.right):
                    return True
            return subtree(pr1.left,pr2) or subtree(pr1.right,pr2)
        return subtree(pRoot1,pRoot2) 
            

思路:

(大树中是否包含小树)一棵树是不是另一棵树的子树,需要从根节点开始比起,若根节点相同,则分别比较二者的左右子树,如果根节点不同,则把大树的左(或右)子树看成一棵树,从根节点开始与小树比较。大致想法如此,但是实现细节还要注意。

第一,题目中要求空树不是任何树的子树,所以首先需要判断两棵树中是否有空树,若有一个是空树,则返回false.

大树为空树,则比不包含小树;小树为空树,不是任何树的子树。相必也是默认空树也不是空树的子树。

第二递归调用,表达要清晰。在subtree中若两个树都为空时,说明了两个原始的树并不是空,而是递归调用到子树为空了,这时说明两个树所在部分树是相同的。

如果还不理解还是拿例子两个树来理解。溜着程序走一遍就明白了。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值