剑指 Offer 37. 序列化二叉树
Posted 风去幽墨
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 37. 序列化二叉树相关的知识,希望对你有一定的参考价值。
题目链接:
https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
题意:
实现两个函数,分别用来序列化和反序列化二叉树。
题解:
序列化:
广度优先搜索,来层次遍历并转换为对应的字符串即可。为空时转换为‘null’
反序列化:
序列化的结果即为层次遍历的结果,难点在于如何构建树上节点的左右指向。
可以利用队列按顺序记录节点,这样在顺序遍历序列化结果时,也可以同步知晓其父节点,就可以很容易的解决左右子树指向问题。
代码:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Codec:
def serialize(self, root):
"""Encodes a tree to a single string.
:type root: TreeNode
:rtype: str
"""
if not root:return '[]'
q,ret=[],'['
q.append(root)
#广度优先搜索达到层次遍历的效果
while len(q)>0:
top = q.pop(0)
if top:#判断是否为空
ret+=str(top.val)+','
else:
ret+='null,'
continue
q.append(top.left if top.left else None)
q.append(top.right if top.right else None)
ret=ret[:len(ret)-1]+']'
return ret
def deserialize(self, data):
"""Decodes your encoded data to tree.
:type data: str
:rtype: TreeNode
"""
if data =='[]':return
data = data[1:len(data)-1].split(',')
head,q,id_=None,[],0 #q按照层次记录节点序列,id_标记是左子树还是右子树,root表示当前节点的父节点
for i in range(len(data)):
if not head:
head = TreeNode(data[i])
root = head
else:
if data[i]!='null':
p = TreeNode(data[i])
q.append(p)
else:
p =None
if not id_:
root.left = p
else:
root.right = p
if q:root=q.pop(0)#该节点的右子树绑定后,切换至下个节点
id_=id_^1#切换左右子树
return head
# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.deserialize(codec.serialize(root))
以上是关于剑指 Offer 37. 序列化二叉树的主要内容,如果未能解决你的问题,请参考以下文章