請實現兩個函數,分別用來序列化和反序列化二叉樹。
示例:
你可以將以下二叉樹:
序列化爲 “[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))