题目:
算法效率
序列化
序列化时,先序遍历访问一遍树,当指针为空时,用 “#” 表示 None。
序列化目的是将用链表表示的树转化为字符串。
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
# 构建前序序列
s = []
p = root
preOrder = []
if not root:
return ""
while p or s:
while p:
preOrder.append(str(p.val))
s.append(p)
p = p.left
preOrder.append("#")
p = s.pop()
p = p.right
return ",".join(preOrder)
反序列化
得到先序遍历顺序表示的树后,我们同样用先序遍历来复原,就是咋访问的咋复原,你也可以用中序、后续、层次遍历,都是同样的道理:记住用什么方法访问的,就用同样的方法复原。
反序列化需要将字符串表示的树,还原为链表结构。所有我们在访问左/右子树时,还要多做一步,判断当前子树的左/右子树(序列)是否为空(用“#”代表),如果不为空要赋一个结点对象给它,然后把指针往后移位。
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if not data:
return None
pindex = 0
data = data.split(",")
p = root = TreeNode(data[0])
s = []
while p or s:
while p:
p.val = data[pindex] # 更新自己的值
pindex += 1
s.append(p)
if (pindex < len(data) and data[pindex] != "#"):
p.left = TreeNode(data[pindex])
p = p.left
p = s.pop()
pindex += 1
if (pindex < len(data) and data[pindex] != "#"):
p.right = TreeNode(-1)
p = p.right
return root
测试用例
if __name__ == '__main__':
ROOT =TreeNode(1)
t2 = TreeNode(2)
t3 = TreeNode(3)
t4 = TreeNode(4)
t5 = TreeNode(5)
ROOT.left = t2
ROOT.right = t3
t3.left = t4
t3.right = t5
ser = Codec2()
de = Codec2()
# de.deserialize(ser.serialize([]))
de.deserialize(ser.serialize(ROOT))
真的很建议大家用堆栈来实现,递归谁都会