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爬虫教程之爬取百度贴吧并下载的示例
Mar 07 Python
fastcgi文件读取漏洞之python扫描脚本
Apr 23 Python
python自动发邮件库yagmail的示例代码
Feb 23 Python
一百行python代码将图片转成字符画
Feb 19 Python
PYQT5实现控制台显示功能的方法
Jun 25 Python
教你一步步利用python实现贪吃蛇游戏
Jun 27 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
Mar 13 Python
Python 多线程共享变量的实现示例
Apr 17 Python
python 实现网易邮箱邮件阅读和删除的辅助小脚本
Mar 01 Python
Python基础之元组与文件知识总结
May 19 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
Python字典的基础操作
Nov 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
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
php线性表顺序存储实现代码(增删查改)
2012/02/16 PHP
php操作MongoDB类实例
2015/06/17 PHP
php添加数据到xml文件的简单例子
2016/09/08 PHP
js DOM模型操作
2009/12/28 Javascript
js获取location.href的参数实例代码
2013/08/02 Javascript
js 窗口抖动示例
2013/09/04 Javascript
jQuery实现按键盘方向键翻页特效
2015/03/18 Javascript
初识Node.js
2015/03/20 Javascript
jQuery中$.extend()用法实例
2015/06/24 Javascript
JavaScript中循环遍历Array与Map的方法小结
2016/03/12 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
JavaScript 字符串常用操作小结(非常实用)
2016/11/30 Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
2017/03/11 Javascript
深入解析Vue 组件命名那些事
2017/07/18 Javascript
jQuery实现可兼容IE6的遮罩功能详解
2017/09/19 jQuery
浅谈python中copy和deepcopy中的区别
2017/10/23 Python
flask框架使用orm连接数据库的方法示例
2018/07/16 Python
Python 中Django验证码功能的实现代码
2019/06/20 Python
详解如何用TensorFlow训练和识别/分类自定义图片
2019/08/05 Python
python Django里CSRF 对应策略详解
2019/08/05 Python
pycharm设置默认的UTF-8编码模式的方法详解
2020/06/01 Python
Python字符串函数strip()原理及用法详解
2020/07/23 Python
加拿大票务网站:Ticketmaster加拿大
2017/07/17 全球购物
佳能加拿大网上商店:Canon eStore Canada
2018/04/04 全球购物
来自世界各地的优质葡萄酒:VineShop24
2018/07/09 全球购物
捷克多品牌在线时尚商店:ANSWEAR.cz
2020/10/03 全球购物
设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。
2014/12/30 面试题
电子商务应届生自我鉴定
2014/01/13 职场文书
网吧消防安全制度
2014/01/28 职场文书
超市优秀员工事迹材料
2014/05/01 职场文书
安全目标责任书
2014/07/22 职场文书
运动会新闻报道稿
2015/07/22 职场文书
实验室安全管理制度
2015/08/05 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
SSM项目使用拦截器实现登录验证功能
2022/01/22 Java/Android