题目描述
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
算法思路
第一版
参考镜像二叉树。
class Solution:
k=0
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
def BB(s,t):
if not s:return
if self.k:return
if s.val!=t.val:
self.isSubtree(s.left,t)
self.isSubtree(s.right,t)
else:
self.k=self.BFS(s,t)
self.isSubtree(s.left,t)
self.isSubtree(s.right,t)
BB(s,t)
return self.k
def BFS(self,a,b):
if not (a or b):return True
if not (a and b):return False
if a.val!=b.val:return False
return self.BFS(a.left,b.left) and self.BFS(a.right,b.right)
执行用时 :308 ms, 在所有 Python3 提交中击败了23.88%的用户
内存消耗 :15.3 MB, 在所有 Python3 提交中击败了5.52%的用户
方法BFS是参考镜像二叉树得到的,用于判断两个树是否相等。
第二版:优化
class Solution:
k=0
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
def BB(s,t):
if not s:return
if self.k:return
if s.val==t.val:self.k=self.BFS(s,t)
self.isSubtree(s.left,t)
self.isSubtree(s.right,t)
# 这里对上一版做的最大优化是在递归函数开头添加了一个条件判断if self.k:return
# 使得if s.val==t.val:self.k=self.BFS(s,t)
# 因为无法使用递归同时做到:遍历与判断,一旦得到目标结果就结束递归。
# 只能得到目标结果后通过条件判断阻断之后的所有递归
BB(s,t)
return self.k
def BFS(self,a,b):
if not (a or b):return True
if not (a and b):return False
if a.val!=b.val:return False
return self.BFS(a.left,b.left) and self.BFS(a.right,b.right)
执行用时 :240 ms, 在所有 Python3 提交中击败了58.06%的用户
内存消耗 :15.1 MB, 在所有 Python3 提交中击败了5.52%的用户
IMPROVE
大佬是直接遍历两棵树,然后对比结果
class Solution:
def isSubtree(self, s: TreeNode, t: TreeNode) -> bool:
ss = self.inorder(s)
st = self.inorder(t)
# print(st)
# print(ss)
return st in ss
def inorder(self,root):
if not root:return' '
return '!'+self.inorder(root.left)+str(root.val)+self.inorder(root.right)
执行用时 :68 ms, 在所有 Python3 提交中击败了99.15%的用户
内存消耗 :14.2 MB, 在所有 Python3 提交中击败了6.08%的用户