LeetCodeDifficult-【面試題37. 序列化二叉樹】

請實現兩個函數,分別用來序列化和反序列化二叉樹。

示例:
你可以將以下二叉樹:
1/ 2   3/ 4   5
序列化爲 “[1,2,3,null,null,4,5]”

注意:本題與主站 297 題相同:https://leetcode-cn.c
om/problems/serialize-and-deserialize-binary-tree/

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。

題目說的說的並不清楚到底要幹嘛,簡單說下,題意就是:給以你一棵二叉樹,然後需要你給出它序列化後的值(即一個list),最後還需要你根據你序列化後的值重新構造一棵二叉樹。

思路1:

**序列化:**其實就是二叉樹的層次遍歷,直接利用colletions的雙端隊列,利用隊列即可實現。如下圖所示,需要注意的是,我們可以將葉子節點的左右節點的Null打印出來,因爲並不影響最終反序列化的結果。如果不希望多打印出null,則需要記錄層數,然後對於對底層葉子節點的null不輸出。
在這裏插入圖片描述
反序列化:其實就是根據二叉的層次遍歷構建二叉樹的工作。
在這裏插入圖片描述

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

    def serialize(self, root):
        """Encodes a tree to a single string.
        :type root: TreeNode
        :rtype: str
        """
        if not root:
            return [] 
        queue = deque()
        queue.append(root)
        ans = []
        count = 0
        lay = 1
        # 層序遍歷
        while queue:
            node = queue.popleft()
            ans.append(node.val if node else None)
            if node == None:
                continue
            queue.append(node.left)
            queue.append(node.right)
        # print(ans)
        return ans

    def deserialize(self, data):
        """Decodes your encoded data to tree.
        :type data: str
        :rtype: TreeNode
        """
        if data == [] or not data:
            return None
        queue = deque()
        root = TreeNode(data[0])
        queue.append(root)
        t = 1
        # 層序遍歷,構建二叉樹
        while queue and t < len(data):
            top = queue.popleft()
            if data[t] != None:
                top.left = TreeNode(data[t])
                queue.append(top.left)
            t += 1
            if data[t] != None:
                top.right = TreeNode(data[t])
                queue.append(top.right)
            t += 1
        return root

# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章