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控制台显示时钟的示例
Feb 24 Python
python实现通过pil模块对图片格式进行转换的方法
Mar 24 Python
python常见的格式化输出小结
Dec 15 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
Numpy数据类型转换astype,dtype的方法
Jun 09 Python
PyQt5重写QComboBox的鼠标点击事件方法
Jun 25 Python
在linux下实现 python 监控usb设备信号
Jul 03 Python
python 标准差计算的实现(std)
Jul 29 Python
python使用writerows写csv文件产生多余空行的处理方法
Aug 01 Python
Jupyter Notebook远程登录及密码设置操作
Apr 10 Python
python函数map()和partial()的知识点总结
May 26 Python
python Gabor滤波器讲解
Oct 26 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
基于PHP常用函数的用法详解
2013/05/10 PHP
5种PHP创建数组的实例代码分享
2014/01/17 PHP
基于preg_match_all采集后数据处理的一点心得笔记(编码转换和正则匹配)
2014/01/31 PHP
php sybase_fetch_array使用方法
2014/04/15 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
是 WordPress 让 PHP 更流行了 而不是框架
2016/02/03 PHP
PHP模块化安装教程
2016/06/01 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
JavaScript Array扩展实现代码
2009/10/14 Javascript
javascript 进阶篇2 CSS XML学习
2012/03/14 Javascript
jquery ajax 局部刷新小案例
2014/02/08 Javascript
JS清空多文本框、文本域示例代码
2014/02/24 Javascript
jquery退出each循环的写法
2014/02/26 Javascript
jquery获取checkbox的值并post提交
2015/01/14 Javascript
Node.js刷新session过期时间的实现方法推荐
2016/05/18 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
解决vue单页路由跳转后scrollTop的问题
2018/09/03 Javascript
详解基于React.js和Node.js的SSR实现方案
2019/03/21 Javascript
Vue列表循环从指定下标开始的多种解决方案
2020/04/08 Javascript
vue 二维码长按保存和复制内容操作
2020/09/22 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
js实现弹幕墙效果
2020/12/10 Javascript
python获取从命令行输入数字的方法
2015/04/29 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
如何使用Python自动生成报表并以邮件发送
2020/10/15 Python
HTML5 自动聚焦(autofocus)属性使用介绍
2013/08/07 HTML / CSS
澳大利亚最大的百货公司:Myer
2018/12/21 全球购物
个人校本研修方案
2014/05/26 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
增员口号大全
2014/06/18 职场文书
材料员岗位职责
2015/02/10 职场文书
python 破解加密zip文件的密码
2021/04/22 Python
Python数据可视化之用Matplotlib绘制常用图形
2021/06/03 Python
nginx共享内存的机制详解
2022/03/21 Servers
直播实况, OMG破敌三路五十分钟大战神技局摩托车
2022/04/01 DOTA
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android