《剑指offer》面试题14:树的子结构(Python)

题目描述

输入两棵二叉树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
     #空树不是任何一个树的子结构,不符合定义,直接返回Fasle
if pRoot1 == None or pRoot2 == None: return False return self.isSubtree(pRoot1, pRoot2) def isSubtree(self, p1, p2): if p2 == None: return True if p1 == None: return p1 == p2 res = False if p1.val == p2.val:#假设我们输入进来的两棵树是相同的,则来判断是否是相同的,如果是相同的则输出True,相同的树互为子结构 res = self.isSubtree(p1.left, p2.left) and self.isSubtree(p1.right, p2.right)
    #如果输入进来的两颗树是不相同的,那么大树的左子树和右子树其中有一个为p2树所在的树则返回为真
return res or self.isSubtree(p1.left, p2) or self.isSubtree(p1.right, p2)

 解法二:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def isSubStructure(self, A: TreeNode, B: TreeNode) -> bool:
        #空树不是任意树的子结构,因此返回False
        if A == None or B == None:
            return False
        #两棵树是完全相同的,则互为子结构
        return self.dfs(A,B) or self.isSubStructure(A.left,B) or self.isSubStructure(A.right,B)
    
    #利用dfs()函数来判断两棵树是否是相同
    def dfs(self, A: TreeNode, B: TreeNode) -> bool:
        #为啥B树都啥也没了,还能够和A一样?返回True?
        if B == None:
            return True
        if A == None:
            return False
        return A.val == B.val and self.dfs(A.left,B.left) and self.dfs(A.right,B.right)

 

posted @ 2020-08-26 19:53  Geeksongs  阅读(270)  评论(0编辑  收藏  举报

Coded by Geeksongs on Linux

All rights reserved, no one is allowed to pirate or use the document for other purposes.