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中模块的__all__属性详解
Oct 26 Python
利用python编写一个图片主色转换的脚本
Dec 07 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
django manage.py扩展自定义命令方法
May 27 Python
python 生成图形验证码的方法示例
Nov 11 Python
python使用pdfminer解析pdf文件的方法示例
Dec 20 Python
使用Python实现将list中的每一项的首字母大写
Jun 11 Python
Django对数据库进行添加与更新的例子
Jul 12 Python
python3的print()函数的用法图文讲解
Jul 16 Python
Python实现微信中找回好友、群聊用户撤回的消息功能示例
Aug 23 Python
python中return如何写
Jun 18 Python
Python中with上下文管理协议的作用及用法
Mar 18 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的call_user_func传reference引发的思考
2010/07/23 PHP
使用PHP实现密保卡功能实现代码&amp;lt;打包下载直接运行&amp;gt;
2011/10/09 PHP
Laravel 4 初级教程之视图、命名空间、路由
2014/10/30 PHP
PHP判断是否为空的几个函数对比
2015/04/21 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
PHP小程序支付功能完整版【基于thinkPHP】
2019/03/26 PHP
JavaScript 入门·JavaScript 具有全范围的运算符
2007/10/01 Javascript
js继承 Base类的源码解析
2008/12/30 Javascript
js中根据字数截取字符串,不能截断url
2012/01/12 Javascript
简单漂亮的js弹窗可自由拖拽且兼容大部分浏览器
2013/10/22 Javascript
JavaScript利用正则表达式去除日期中的-
2014/06/09 Javascript
javascript创建含数字字母的随机字符串方法总结
2016/08/01 Javascript
js 将图片连接转换成base64格式的简单实例
2016/08/10 Javascript
扩展Bootstrap Tooltip插件使其可交互的方法
2016/11/07 Javascript
JS实现两周内自动登录功能
2017/03/23 Javascript
Vue-Router2.X多种路由实现方式总结
2018/02/09 Javascript
jQuery实现的监听导航滚动置顶状态功能示例
2018/07/23 jQuery
一文快速了解JQuery中的AJAX
2019/05/31 jQuery
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
2019/06/24 Javascript
python 实现插入排序算法
2012/06/05 Python
Python虚拟环境Virtualenv使用教程
2015/05/18 Python
Python运算符重载用法实例分析
2015/06/01 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
2018/01/29 Python
python 删除指定时间间隔之前的文件实例
2018/04/24 Python
python3.6使用pickle序列化class的方法
2018/10/22 Python
django做form表单的数据验证过程详解
2019/07/26 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
关于tf.TFRecordReader()函数的用法解析
2020/02/17 Python
2014年小班元旦活动方案
2014/02/16 职场文书
2015年度服装销售工作总结
2015/03/31 职场文书
二胎满月酒致辞
2015/07/29 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
怎么用Python识别手势数字
2021/06/07 Python
Pygame Rect区域位置的使用(图文)
2021/11/17 Python
Python使用pandas导入csv文件内容的示例代码
2022/12/24 Python