LeetCode-297、二叉樹的序列化與反序列化-困難

LeetCode-297、二叉樹的序列化與反序列化-困難

序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。

請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化爲一個字符串並且將這個字符串反序列化爲原始的樹結構。

示例:

你可以將以下二叉樹:

    1
   / \
  2   3
     / \
    4   5

序列化爲 "[1,2,3,null,null,4,5]"

提示:這與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。

說明:不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。

 

代碼:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Codec:

    def serialize(self, root):
        """Encodes a tree to a single string.
        
        :type root: TreeNode
        :rtype: str
        """
        data = []
        que = [root]
        while que:
            tmp = que.pop(0)
            if tmp:
                data.append(tmp.val)
                que.append(tmp.left)
                que.append(tmp.right)
            else:
                data.append('null')      
        return data
        

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        
        :type data: str
        :rtype: TreeNode
        """
        if data[0] == 'null':
            return None
        root = TreeNode(data[0])
        que = [root]
        i = 1
        while que:
            tmp = que.pop(0)
            if tmp == None:
                continue
            tmp.left = TreeNode(data[i]) if data[i] != 'null' else None
            tmp.right = TreeNode(data[i+1]) if data[i+1] != 'null' else None
            i += 2
            que.append(tmp.left)
            que.append(tmp.right)
        return root

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章