652. 寻找重复的子树(DFS+序列化处理)

119 阅读2分钟

image.jpeg

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第4天,点击查看活动详情

测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。

怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~

一、题目描述:

  • 题目内容

    image.png

  • 题目示例

    image.png

  • 题目解析

    • 树中的结点数在[1,10^4]范围内。
    • -200 <= Node.val <= 200

二、思路分析:

我们拿到本题,读取题目内容要求在二叉树中找到重复的子树并返回重复子树的根结点值,那么重复的子树具备怎么样呢,继续审题明确细节:

  • 两个棵树中如果存在相同结构和相同的终点值,则判断它们是重复子树
  • 找到重复子树,需要对树的节点进行序列化转换
  • 遍历树时,需要判断结构,则需要只能进行前序遍历或后续遍历

根据以上信息,我们可以使用二叉树深度遍历-前序遍历序列化结合哈希表来解答该题,思路如下:

  • 二叉树的每一个节点都是TreeNode类型,将节点值转换成字符串类型与左右子树拼接的值作为哈希表treemap的key值,val则记录相同结构的子树出现次数
  • 当前节点cur使用""下划线来连接左右子树序列化形式,str(root.val) + "" + dfs(root.left) + "_" + dfs(root.right)
  • 当cur不存在treemap中,则treemap[cur] = 1
  • 当cur存在treemap中,则treemap[cur] +=1
  • 当treep[cur] ==2时,则将root节点添加到ans列表中
  • 直到root为空,返回空字符为止,否则返回cur image.png 根据以上思路,我们使用Python快速实现,代码如下:
    class Solution(object):
        def findDuplicateSubtrees(self, root):
            """
            :type root: TreeNode
            :rtype: List[TreeNode]
            """
            treemap = {}
            ans = []
            def dfs(root):
                if not root:return ""
                cur =  str(root.val) + "_" + dfs(root.left) + "_" + dfs(root.right)
                if cur not in treemap:
                    treemap[cur] = 1
                else:
                    treemap[cur] +=1
                if treemap[cur] == 2:
                    ans.append(root)
                return cur
            dfs(root)
            return ans
    
    

三、总结:

本题考察二叉树处理序列化处理,需要对二叉树每一个节点连接转化成字符串形式,将未出现节点存储在哈希表里找到重复节点,AC提交记录如下:

image.png

  • 时间复杂度:O(n^2),递归遍历时间复杂度为n^2
  • 空间复杂度:O(n),递归需要占用额外空间

以上是本期内容,欢迎大佬们点赞评论,下期见~~~