《剑指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)