二叉树的序列化 力扣 297. 二叉树的序列化与反序列化 652. 寻找重复的子树

本文介绍了如何通过后序遍历实现二叉树的序列化与反序列化,并针对652题的重复子树搜索,展示了如何构建解决方案。通过实例展示了将树结构转换为字符串和从字符串重构树的过程,以及寻找重复子树的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

297. 二叉树的序列化与反序列化

在这里插入图片描述
解题思路:
利用前文所说,分解的思路

序列化: 后序遍历拼接字符串。
反序列化:由于要分割字符串的逗号,额外采用一个 helper 函数来递归地分解并拼接成树。


class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return 'None'

        left = self.serialize(root.left)
        right = self.serialize(root.right)

        return str(root.val) + ',' + str(left)  +','+ str(right)


    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        
        data = data.split(',')
        
        root = self.helper(deque(data))
        return root
        

    def helper(self,data):

        val=data.popleft()
        if val=='None':
            return None

        root = TreeNode(int(val))
        root.left = self.helper(data)
        root.right = self.helper(data)
        return root


652. 寻找重复的子树

在这里插入图片描述
解题思路:

先把树序列化为字符串。
后序遍历比较重复的字符串。

class Solution:
    def findDuplicateSubtrees(self, root: Optional[TreeNode]) -> List[Optional[TreeNode]]:
        """序列化整颗树的子树序列, 如果已存在这样的子树, 则输出
        """
        self.res = []
        self.counter = Counter()
        self.traverse(root)
        return self.res

    def traverse(self, root):

        if not root:
            return None
        left = self.traverse(root.left)
        right = self.traverse(root.right)
		
		#序列化字符串
        chain = str(root.val) + ',' + str(left) + ',' + str(right) 
        
		#字典记录每一个字符串
        self.counter[chain] += 1
        
        #list 中记录重复结构字符串
        if self.counter[chain] == 2:
            self.res.append(root)
        return chain
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Not_Today.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值