序列化二叉樹
題目
請實現兩個函數,分別用來序列化和反序列化二叉樹
二叉樹的序列化是指:把一棵二叉樹按照某種遍歷方式的結果以某種格式保存爲字符串,從而使得內存中建立起來的二叉樹可以持久保存。序列化可以基於先序、中序、後序、層序的二叉樹遍歷方式來進行修改,序列化的結果是一個字符串,序列化時通過 某種符號表示空節點(#),以 ! 表示一個結點值的結束(value!)。
二叉樹的反序列化是指:根據某種遍歷順序得到的序列化字符串結果str,重構二叉樹。
例如,我們可以把一個只有根節點爲1的二叉樹序列化爲"1,",然後通過自己的函數來解析回這個二叉樹
分析
僅靠先序遍歷,無法還原出樹的形狀,比如4在1還是2的位置都是一樣的先序遍歷順序,都是5,3,2,4,7,6,8。但是如果在結點後面標註出None值後則可保證其唯一性,比如5,3,2,#,4,#,7,6,#,8,#。
對於該題,所謂的序列化與反序列化也就是某個字符串(帶有‘#’,唯一性)和二叉樹之間的相互轉換。
代碼
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Serialize(self, root):
# write code here
retList = []
# 前序遍歷
def preOrder(root):
if root == None:
retList.append('#')
return
retList.append(str(root.val))
preOrder(root.left)
preOrder(root.right)
preOrder(root)
return ' '.join(retList)
def Deserialize(self, s):
# write code here
retList = s.split()
def dePreOrder():
if retList == []:
return None
rootVal = retList[0]
del retList[0]
if rootVal == '#':
return None
node = TreeNode(int(rootVal))
# 遞歸左右子樹
leftNode = dePreOrder()
rightNode = dePreOrder()
node.left = leftNode
node.right = rightNode
return node
pRoot = dePreOrder()
return pRoot