leetcode 652. 寻找重复的子树

本文详细介绍了LeetCode第652题《寻找重复的子树》的解决方案,主要利用树的序列化方法。首先解释了如何将树的结构转化为字符串,然后通过哈希表存储子树的序列化值,通过比较找出重复的子树。代码中使用递归实现树的序列化,有效地减少了重复计算。
摘要由CSDN通过智能技术生成

leetcode 652. 寻找重复的子树

题目描述

在这里插入图片描述

解决方案

使用序列化的方式解决
一种朴素的方法是,将每个节点为根的子树都保存下来,之后进行比较就可以得到最终的结果。但是如何保存一棵树是一个难点。一种解决方法是我们将树的值按照先序遍历的的方式保存到字符串中,就是序列化。
在这里插入图片描述有了这个概念之后,我们就可以将每个子树的序列化结果保存到哈希表中,通过比较子树序列化的结果来找到重复的子树。
我们可以使用递归的方式进行树的序列化,并在递归的过程中保存从叶子到根的子树序列化值,可以减少计算重复的次数。
序列化递归的python代码为

def construct(root):
        if root is None: return '#'
        serial = f'{root.val},{construct(root.left)},{construct(root.right)}'
        return serial

完整题目的解答代码为:

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findDuplicateSubtrees(self, root: TreeNode) -> List[TreeNode]:
        self.mp = {}
        self.ans = []
        self.construct(root)
        return self.ans

    def construct(self, root):
        if root is None: return '#'
        serial = f'{root.val},{self.construct(root.left)},{self.construct(root.right)}'
        if(serial not in self.mp.keys()):
            self.mp[serial] = 1
        else:
            self.mp[serial] +=1
        if(self.mp[serial]==2):
            self.ans.append(root)
        return serial
        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值