python 二叉树的序列化和反序列化
python 二叉树的序列化和反序列化
- 一、leetcode 297
- 二、为什么要反序列化?
- 三、反序列化设计
- 四、序列化设计
- 五、leetcode 297题
一、leetcode 297
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
二、为什么要反序列化?
1、给定一个二叉树的列表,需要转换成我们熟悉的链表存储形式,就能方便递归解题。
2、反序列化后可以方便本地IDE调试二叉树题。
二叉树列表:[0,1,2,None,4,None,6,7]
对应的树的结构如下:
即:链表形式
三、反序列化设计
二叉树的定义
# 树的定义
class TreeNode(object):def __init__(self, x):self.val = xself.left = Noneself.right = None
算法流程:
1. 特例处理: 若 data 为空,直接返回 null ;
2. 初始化: 指针 i = 1 ,根节点 root (值为 vals[0] ),队列 queue(包含 root )
3.按层构建:
当 queue 为空时跳出;节点出队,记为 node ;
构建 node 的左子节点:node.left 的值为 data[i] ,并将 node.left 入队;
执行 i += 1 ;
构建 node 的右子节点:node.left 的值为 data[i] ,并将 node.left 入队;
执行 i += 1 ;
4.返回值: 返回根节点 root 即可;
class Codec:def deserialize(self, data):if not data:returnvals, i = data, 1root = TreeNode(vals[0])queue = [root]while queue:node = queue.pop(0)"当指针超出列表时,子节点值为NONE,直接出循序即可"if i > len(data) - 1:breakif vals[i]:node.left = TreeNode(vals[i])queue.append(node.left)i += 1"当指针超出列表时,子节点值为NONE,直接出循序即可"if i > len(data) - 1:breakif vals[i]:node.right = TreeNode(vals[i])queue.append(node.right)i += 1return roottree = [0, 1, 2, None, 4, None, 6, 7]
code = Codec()
root = code.deserialize(tree)
通过前序遍历,查看构建的结果是否正确:
res = []
def dfs(root):if not root:returnres.append(root.val)dfs(root.left)dfs(root.right)dfs(root)
print(res)
执行结果正确:
四、序列化设计
def serialize(self, root):if not root:return []queue = [root]res = []while queue:node = queue.pop(0)if node:res.append(node.val)queue.append(node.left)queue.append(node.right)else:res.append(None)return resprint(code.serialize(root))
结果如下:
与输入的树的列表相比,多了以下五个None值。
五、leetcode 297题
题解类似,需要把列表进行字符串化:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = Noneclass Codec:def serialize(self, root):"""Encodes a tree to a single string.:type root: TreeNode:rtype: str"""if not root:return "[]"res = []quence = [root]while quence:r = quence.pop(0)if r:res.append(str(r.val))quence.append(r.left)quence.append(r.right)else:res.append("None")return "[" + ",".join(res) + "]"def deserialize(self, data):"""Decodes your encoded data to tree.:type data: str:rtype: TreeNode"""if data == "[]":returndata = data[1:-1].split(',')i = 1root = TreeNode(val=int(data[0]))quence = [root]while quence:node = quence.pop(0)if not data[i] == "None":node.left = TreeNode(int(data[i]))quence.append(node.left)i += 1if not data[i] == "None":node.right = TreeNode(int(data[i]))quence.append(node.right)i += 1return root# Your Codec object will be instantiated and called as such:
# ser = Codec()
# deser = Codec()
# ans = deser.deserialize(ser.serialize(root))
python 二叉树的序列化和反序列化相关推荐
- python代码实现二叉树的序列化和反序列化
python代码实现二叉树的序列化和反序列化 二叉树的序列化 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字 符串,从而使得内存中建立起来的二叉树可以持久保存. 二叉树的反序 ...
- lintcode 7. 二叉树的序列化和反序列化 Python代码
'''7. 二叉树的序列化和反序列化 描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化 ...
- LeetCode 297. 二叉树的序列化与反序列化 | Python
文章目录 297. 二叉树的序列化与反序列化 题目 解题思路 代码实现 实现结果 总结 297. 二叉树的序列化与反序列化 题目来源:力扣(LeetCode)https://leetcode-cn.c ...
- C++实现二叉树的序列化和反序列化
1. 题目要求 二叉树的序列化和反序列化 2. 思路 2.1 序列化 首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串.先序遍历二叉树,如果遇到空节点,就在 ...
- 【LeetCode 二叉树专项】二叉树的序列化与反序列化(297)
文章目录 1. 题目 1.1 示例 1.2 说明 1.3 提示 1.4 进阶 2. 解法一(前序遍历) 2.1 分析 2.2 解答 2.3 复杂度 3. 解法二(后序遍历) 3.1 分析 3.2 解答 ...
- [Java]LeetCode297. 二叉树的序列化与反序列化 | Serialize and Deserialize Binary Tree
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★ ➤微信公众号:山青咏芝(shanqingyongzhi) ➤博客园地址:山青咏芝(https://www.cnblog ...
- 二叉树的序列化与反序列化
题目: 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来 ...
- 算法练习day10——190328(二叉树的先序、 中序、 后序遍历, 包括递归方式和非递归方式、找到一个节点的后继节点、二叉树的序列化和反序列化)
1.实现二叉树的先序. 中序. 后序遍历, 包括递归方式和非递归方式 1.1 访问节点的顺序 节点访问顺序如下图所示: 访问顺序:1 2 4 4 4 2 5 5 5 2 1 3 6 6 6 3 7 7 ...
- 【数据结构与算法】之深入解析“二叉树的序列化与反序列化”的求解思路与算法示例
一.题目要求 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个 ...
最新文章
- 【C++】C++ 强制转换运算符
- Google经典面试题解析
- linux下shell显示-bash-4.1#不显示路径解决方法
- xml批量修改php,通过php修改xml文档内容的方法
- C#中读取带有Xmlns命名空间的XML文件
- ext 部署到 tomcat服务器下,通过http8080端口查看
- python逐个读取字符_玩转python之字符串逐个字符或逐词反转
- 重磅 | 《机器学习综述》算法分类及特征工程手推笔记!
- 关于广告投放系统:竞价策略(2018)
- 锁定计算机和睡眠有什么区别,电脑休眠和睡眠哪个好?电脑计算机睡眠和休眠有什么区别...
- 推荐算法之DeepFM
- ansys安装注意事项
- 关于最短剩余时间优先算法-进程调度模拟【C++】
- 红黑树——简单明了的学生思路
- 年末总结(androidbug)
- linux vi把一个文件中的内容复制到另一个文件,vim - 将内容从一个文件复制并粘贴到vi中的另一个文件...
- sql查询结果加上序号
- Python学习第001课--课后复习
- JD eid fp
- 计算机内存清理器,轻量便捷的内存清理工具PC版
热门文章
- Vue 项目如何使用Echarts , 手摸手带你入门
- Java学习之路05---运算子
- 第39届龙家展盛大开幕,规模为历届之最,首日人气旺盛
- 快速画圆切线lisp_AUTOCAD中快速画2圆切线的LISP,无需设置选择切点
- git pull 配置免密_git 阿里云code免密pull push
- i.MX Yocto项目用户指南 -- 下
- msp430G2553串口通信_launchpad串口通信
- Django 数据统计查询
- Python+Vue计算机毕业设计热贡文化艺术展示与定制s5g19(源码+程序+LW+部署)
- uni-app把一个页面当做是子组件来用。这个页面既可以单独的显示也可以作为组件用。