刷题系列——序列化和反序列化一个二叉树

  

序列化和反序列化一个二叉树,是很开放的一题,就是给出一个二叉树,用序列化方法生成一个字符串,然后用反序列化方法把这个字符串生成原来二叉树。这个在编程时候各个类型一般都有序列化的,用于存储。

     

这里面要用转到python中列表化字符串方法& # 39;,& # 39;. join(列表),和字符串转换为列表的方法string.split (& # 39; & # 39;)。

     

其实可以用之前刷题的几个题目来组合,比如遍历二叉树生成中序和后序两个队列,合并为一个队列,作为序列化方法,然后有一题是按照中序和后序队列生成二叉树,就可以作为反序列化的方法使用。当然,这样会有很多冗余数据。

     

其实这个题目比较麻烦的地方就是优化,实现倒是很不难。

  

我这边用了序列化层级遍历,就是从根节点到叶子节点一层层按照从左到用遍历,如果某个节点的左或者右子节点为空,用#号代替;最后叶子节点下面会都是“#”号,这里做了个判断,如果某层都是#号,视作为空,结束遍历。

     

反序列化采用对应的方法,这里不多说,看代码即可。

  
 #, Definition  for  a  binary  tree 节点。
  #,class  TreeNode(对象):
  #,,,,,def  __init__(自我,,x):
  #,,,,,,,,,self.val =, x
  #,,,,,,,,,self.left =,没有
  #,,,,,,,,,self.right =,没有
  class 编码:
  ,,,def 序列化(自我,,根):
  ,,,,,,,“““Encodes  a  tree 用a  single 字符串。
  ,,,,,,,
  ,,,,,,,:type 根:TreeNode
  ,,,,,,,:rtype: str
  ,,,,,,,,,,
  ,,,,,,,if  root  !=,没有:
  ,,,,,,,,,,,checkList =,(根)
  ,,,,,,,其他的:
  ,,,,,,,,,,,checkList =, []
  ,,,,,,,AllNodeList =, []
  ,,,,,,,while  checkList  !=, []:
  ,,,,,,,,,,,nextList =, []
  ,,,,,,,,,,,for  Node 拷贝清单:
  ,,,,,,,,,,,,,,,if  Node  !=, & # 39; # & # 39;:
  ,,,,,,,,,,,,,,,,,,,AllNodeList.append (str (Node.val))
  ,,,,,,,,,,,,,,,,,,,if  Node.left ==,没有:
  ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (& # 39; # & # 39;)
  ,,,,,,,,,,,,,,,,,,,其他的:
  ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (Node.left)
  ,,,,,,,,,,,,,,,,,,,if  Node.right ==,没有:
  ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (& # 39; # & # 39;)
  ,,,,,,,,,,,,,,,,,,,其他的:
  ,,,,,,,,,,,,,,,,,,,,,,,nextList.append (Node.right)
  ,,,,,,,,,,,,,,,其他的:
  ,,,,,,,,,,,,,,,,,,,AllNodeList.append(节点)
  ,,,,,,,,,,,if  len(设置(nextList)),==, 1,以及& # 39;# & # 39;,拷贝nextList:
  ,,,,,,,,,,,,,,,nextList =, []
  ,,,,,,,,,,,checkList =nextList
  ,,,,,,,return  & # 39; & # 39; . join (AllNodeList)
  ,,,,,,,
  ,,,def 反序列化(自我,,数据):
  ,,,,,,,“““Decodes  your  encoded  data 用树。
  ,,,,,,,
  ,,,,,,,:type 数据:str
  ,,,,,,,:rtype: TreeNode
  ,,,,,,,,,,
  ,,,,,,,if  data ==, & # 39; & # 39;:
  ,,,,,,,,,,,currentLevel =, []
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

刷题系列——序列化和反序列化一个二叉树