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 相关文章推荐
tornado捕获和处理404错误的方法
Feb 26 Python
Python def函数的定义、使用及参数传递实现代码
Aug 10 Python
Python多进程分块读取超大文件的方法
Apr 13 Python
Django1.7+python 2.78+pycharm配置mysql数据库
Oct 09 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
python微信公众号之关键词自动回复
Jun 15 Python
python sorted函数的小练习及解答
Sep 18 Python
python/Matplotlib绘制复变函数图像教程
Nov 21 Python
使用PyTorch实现MNIST手写体识别代码
Jan 18 Python
tensorflow实现测试时读取任意指定的check point的网络参数
Jan 21 Python
python实现图片横向和纵向拼接
Mar 05 Python
Python 使用office365邮箱的示例
Oct 29 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新手上路(五)
2006/10/09 PHP
smarty 原来也不过如此~~呵呵
2006/11/25 PHP
Laravel 5.0 发布 新版本特性详解
2015/02/10 PHP
js活用事件触发对象动作
2008/08/10 Javascript
javascript 另一种图片滚动切换效果思路
2012/04/20 Javascript
jQuery对象数据缓存Cache原理及jQuery.data方法区别介绍
2013/04/07 Javascript
得到form下的所有的input的js代码
2013/11/07 Javascript
jquery easyui combobox模糊过滤(示例代码)
2013/11/30 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
jQuery选择id属性带有点符号元素的方法
2015/03/17 Javascript
javascript原始值和对象引用实例分析
2015/04/25 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
js实现鼠标点击文本框自动选中内容的方法
2015/08/20 Javascript
javascript实现延时显示提示框特效代码
2016/04/27 Javascript
JS给Array添加是否包含字符串的简单方法
2016/10/29 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
js实现扫雷小程序的示例代码
2017/09/27 Javascript
Node.js创建一个Express服务的方法详解
2020/01/06 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
Javascript中Math.max和Math.max.apply的区别和用法详解
2020/08/24 Javascript
OpenLayers加载缩放控件使用方法详解
2020/09/25 Javascript
urllib2自定义opener详解
2014/02/07 Python
Python实现的ini文件操作类分享
2014/11/20 Python
python 读写excel文件操作示例【附源码下载】
2019/06/19 Python
Python input函数使用实例解析
2019/11/22 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
如何解决cmd运行python提示不是内部命令
2020/07/01 Python
Python装饰器结合递归原理解析
2020/07/02 Python
Python+Xlwings 删除Excel的行和列
2020/12/19 Python
什么是"引用"?申明和使用"引用"要注意哪些问题?
2016/03/03 面试题
如何保障Web服务器安全
2014/05/05 面试题
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
机械工程及自动化专业求职信
2014/09/03 职场文书
实习协议书范本
2014/09/25 职场文书
react中的DOM操作实现
2021/06/30 Javascript
使用python绘制横竖条形图
2022/04/21 Python