剑指 Offer 37. 序列化二叉树

题目:请实现两个函数,分别用来序列化和反序列化二叉树。  困难

你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

方法:层序遍历  时间复杂度O(n)  空间复杂度O(n) 

层序遍历能保证二叉树的唯一性

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        if root is None:
            return ''
        
        res = ''
        queue = [root]
        res += str(root.val) + ' '
        while queue != []:
            size = len(queue)
            for i in range(size):
                cur = queue.pop(0)
                if cur.left:
                    queue.append(cur.left)
                    res += str(cur.left.val) + ' '
                else:
                    res += '# '
                if cur.right:
                    queue.append(cur.right)
                    res += str(cur.right.val) + ' '
                else:
                    res += '# '
        return res

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if data == '':
            return None
        
        node_list = data.split()
        length = len(node_list)
        head = TreeNode(node_list[0])
        queue = [head]
        j = 1
        while queue != []:
            size = len(queue)
            for i in range(size):
                cur = queue.pop(0)
                if j < length and node_list[j] != '#':
                    node = TreeNode(int(node_list[j]))
                    cur.left = node
                    queue.append(node)
                j += 1
                if j < length and node_list[j] != '#':
                    node = TreeNode(int(node_list[j]))
                    cur.right = node
                    queue.append(node)
                j += 1
        
        return head


        

 

posted @ 2022-08-06 11:50  Liang-ml  阅读(17)  评论(0)    收藏  举报