【力扣日记】572 另一个树的子树 | 递归 BFS

题目描述

给定两个非空二叉树 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%的用户

发布了210 篇原创文章 · 获赞 20 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Heart_for_Ling/article/details/104825913