這個題之前做過,297.二叉樹的序列化和反序列化,這裏還是用這種寫法,劍指Offer上的代碼是C++的,使用的是Stream,這裏我們用字符串進行保存來序列化,將字符串轉換成列表進行反序列化。
Python題解
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Serialize(self, root):
def predfs(node, res):
if not node:res+="#!"
else:
res = res + str(node.val) + "!"
res = predfs(node.left, res)
res = predfs(node.right, res)
return res
return predfs(root, "")
def Deserialize(self, s):
def helper(s):
if s[0] == "#":
s.pop(0)
return None
node = TreeNode(int(s.pop(0)))
node.left = helper(s)
node.right = helper(s)
return node
data = s.split("!")
return helper(data)
考點
- 考查分析複雜問題的能力。爲了把這個問題分析清楚,我們把樹分成3部分:根節點、左子樹和右子樹,在序列化/反序列化根節點之後再分別序列化/反序列化左、右子樹,因此可以遞歸解決。解決這個問題的關鍵在於把一個大的問題分解成幾個小問題,並遞歸的解決小問題;
- 考查對二叉樹的遍歷的理解及編程能力。