Python实现的序列化和反序列化二叉树算法示例


Posted in Python onMarch 02, 2019

本文实例讲述了Python实现的序列化和反序列化二叉树算法。分享给大家供大家参考,具体如下:

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树

序列化二叉树

先序遍历二叉树

def recursionSerialize(self, root):
    series = ''
    if root == None:
      series += ',$'
    else:
      series += (',' + str(root.val))
      series += self.recursionSerialize(root.left)
      series += self.recursionSerialize(root.right)
    return series
  def Serialize(self, root):
    return self.recursionSerialize(root)[1:]

结果:

root = TreeNode(11)
root.left = TreeNode(2)
root.right = TreeNode(3)
series = Solution().Serialize(root)
print(series)
>>>11,2,$,$,3,$,$

反序列化

先构建根节点,然后左节点,右节点,同样是递归

注意由于使用的是字符串的表示形式,可以先转化为list,

print(series.split(','))
>>>['11', '2', '$', '$', '3', '$', '$']

然后再处理就不需要将大于10的数字转换过来了:

def getValue(self, s, sIndex):  #处理超过10的数字,将数字字符转变为数字
    val = 0
    while ord(s[sIndex]) <= ord('9') and ord(s[sIndex]) >= ord('0'):
      val = val * 10 + int(s[sIndex])
      sIndex += 1
    return val, sIndex - 1

下面是反序列化的递归函数:

def Deserialize(self, s):
    if self.sIndex < len(s):
      if s[self.sIndex] == ',':
        self.sIndex += 1
      if s[self.sIndex] == '$':
        return None
      val, self.sIndex = self.getValue(s, self.sIndex)
      treeNode = TreeNode(val)
      self.sIndex += 1
      treeNode.left = self.Deserialize(s)
      self.sIndex += 1
      treeNode.right = self.Deserialize(s)
      return treeNode

完整解法

class TreeNode:
  def __init__(self, x):
    self.val = x
    self.left = None
    self.right = None
class Solution:
  def __init__(self):
    self.sIndex = 0
  def recursionSerialize(self, root):
    series = ''
    if root == None:
      series += ',$'
    else:
      series += (',' + str(root.val))
      series += self.recursionSerialize(root.left)
      series += self.recursionSerialize(root.right)
    return series
  def Serialize(self, root):
    return self.recursionSerialize(root)[1:]
  def getValue(self, s, sIndex):  #处理超过10的数字,将数字字符转变为数字
    val = 0
    while ord(s[sIndex]) <= ord('9') and ord(s[sIndex]) >= ord('0'):
      val = val * 10 + int(s[sIndex])
      sIndex += 1
    return val, sIndex - 1
  def Deserialize(self, s):
    if self.sIndex < len(s):
      if s[self.sIndex] == ',':
        self.sIndex += 1
      if s[self.sIndex] == '$':
        return None
      val, self.sIndex = self.getValue(s, self.sIndex)
      treeNode = TreeNode(val)
      self.sIndex += 1
      treeNode.left = self.Deserialize(s)
      self.sIndex += 1
      treeNode.right = self.Deserialize(s)
      return treeNode

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
PYTHON正则表达式 re模块使用说明
May 19 Python
python 自动去除空行的实例
Jul 24 Python
python pygame模块编写飞机大战
Nov 20 Python
详解python爬虫系列之初识爬虫
Apr 06 Python
深入了解Python在HDA中的应用
Sep 05 Python
python反转列表的三种方式解析
Nov 08 Python
PyTorch实现AlexNet示例
Jan 14 Python
python3.8与pyinstaller冲突问题的快速解决方法
Jan 16 Python
AUC计算方法与Python实现代码
Feb 28 Python
将tf.batch_matmul替换成tf.matmul的实现
Jun 18 Python
Python descriptor(描述符)的实现
Nov 15 Python
python绘制汉诺塔
Mar 01 Python
Python求一批字符串的最长公共前缀算法示例
Mar 02 #Python
Python实现判断一个整数是否为回文数算法示例
Mar 02 #Python
python实现转圈打印矩阵
Mar 02 #Python
python实现顺时针打印矩阵
Mar 02 #Python
python实现二维数组的对角线遍历
Mar 02 #Python
python实现矩阵打印
Mar 02 #Python
python实现杨氏矩阵查找
Mar 02 #Python
You might like
CodeIgniter框架提示Disallowed Key Characters的解决办法
2014/04/21 PHP
php写的AES加密解密类分享
2014/06/20 PHP
destoon二次开发模板及调用语法汇总
2014/06/21 PHP
php实现QQ空间获取当前用户的用户名并生成图片
2015/07/25 PHP
PHP实现无限级分类(不使用递归)
2015/10/22 PHP
php获取客户端IP及URL的方法示例
2017/02/03 PHP
简述JavaScript的正则表达式中test()方法的使用
2015/06/16 Javascript
jQuery height()、innerHeight()、outerHeight()函数的区别详解
2016/05/23 Javascript
简单实现nodejs上传功能
2017/01/14 NodeJs
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
ReactNative之键盘Keyboard的弹出与消失示例
2017/07/11 Javascript
基于LayUI实现前端分页功能的方法
2017/07/22 Javascript
switchery按钮的使用方法
2017/12/18 Javascript
JavaScript callback回调函数用法实例分析
2018/05/08 Javascript
微信小程序实现简易table表格
2020/06/19 Javascript
vue-cli3配置与跨域处理方法
2019/08/17 Javascript
微信小程序跨页面数据传递事件响应实现过程解析
2019/12/19 Javascript
python中getattr函数使用方法 getattr实现工厂模式
2014/01/20 Python
python通过装饰器检查函数参数数据类型的方法
2015/03/13 Python
Python中返回字典键的值的values()方法使用
2015/05/22 Python
Python时间获取及转换知识汇总
2017/01/11 Python
python executemany的使用及注意事项
2017/03/13 Python
Python批处理更改文件名os.rename的方法
2018/10/26 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
html5利用canvas绘画二级树形结构图的示例
2017/09/27 HTML / CSS
如何在Canvas上的图形/图像绑定事件监听的实现
2020/09/16 HTML / CSS
巴基斯坦电子产品购物网站:Home Shopping
2017/09/14 全球购物
澳大利亚男士西服品牌:M.J.Bale
2018/02/06 全球购物
美国手工艺品市场的领导者:Annie’s
2019/04/04 全球购物
路政管理毕业自荐书范文
2014/02/10 职场文书
中学生运动会入场词
2014/02/12 职场文书
公司应聘自荐书
2014/06/14 职场文书
2014年培训工作总结范文
2014/11/27 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
Flutter集成高德地图并添加自定义Maker的实践
2022/04/07 Java/Android
MySQL GTID复制的具体使用
2022/05/20 MySQL