二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)

297. 二叉树的序列化与反序列化剑指 Offer 37. 序列化二叉树)(剑指 Offer II 048. 序列化与反序列化二叉树

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return ''
        return str(root.val) + ',' + str(self.serialize(root.left)) + ',' + str(self.serialize(root.right))
        
    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if not data:
            return None
        
        def dfs(dataList):
            node = dataList.pop(0)
            if node == '':
                return
            root = TreeNode(int(node))
            root.left = dfs(dataList)
            root.right = dfs(dataList)
            return root

        dataList = data.split(',')
        return dfs(dataList)

序列化的思路就是前序遍历,将各个节点值之间通过 ‘,’ 连接起来;反序列化时,首先根据 ‘,’ 进行分隔,得到的列表就是各个节点的值(字符串),然后进行深度遍历dfs,对每个节点进行树节点构建,左右子树则是递归。

449. 序列化和反序列化二叉搜索树

由于二叉搜素树也是二叉树,所以可以使用上一题的题解。官方题解给出了优化,但是不太好理解,暂时不掌握。

428. 序列化和反序列化 N 叉树

class Codec:
    def serialize(self, root: 'Node') -> str:
        """Encodes a tree to a single string.
        
        :type root: Node
        :rtype: str
        """
        if not root:
            return ''
        data = ''
        data += str(root.val) + ',' + str(len(root.children))
        for child in root.children:
            data += ',' + self.serialize(child)
        return data
	
    def deserialize(self, data: str) -> 'Node':
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: Node
        """
        if not data:
            return None

        def dfs(dataList) -> 'Node':
            node = dataList.pop(0)
            if node == '':
                return
            root = Node(int(node))
            root.children = []
            size = int(dataList.pop(0))
            for _ in range(size):
                root.children.append(dfs(dataList))
            return root

        dataList = data.split(',')
        return dfs(dataList)

同样的思路,只不过序列化时的前序遍历要用 N 叉树的方法,而反序列化时的 dfs 也是要改为 N 叉树的写法,其余都一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值