序列化与反序列化二叉树
2018-06-16 18:53:36
序列化 (Serialization)将对象的状态信息转换为可以存储或传输的形式的过程。反序列化顾名思义就是通过信息流对对象进行重建的过程。
一般来说序列化和反序列化有如下的作用:
public class SerializeandDeserializeTree {// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuffer sb = new StringBuffer();preOrder(root, sb);return sb.toString();}private void preOrder(TreeNode root, StringBuffer stringBuffer) {if (root == null) {stringBuffer.append("00000");}else {byte[] bytes = intToByte(root.val);stringBuffer.append('1').append((char) bytes[0]).append((char) bytes[1]).append((char) bytes[2]).append((char) bytes[3]);preOrder(root.left, stringBuffer);preOrder(root.right, stringBuffer);}}private byte[] intToByte(int val) {return new byte[]{(byte) (val >> 24),(byte) (val >> 16),(byte) (val >> 8),(byte) val};}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {return helper(data.toCharArray(), new int[]{0});}private TreeNode helper(char[] data, int[] pos) {if (pos[0] >= data.length) return null;if (data[pos[0]] == '0') {pos[0] += 5;return null;}int val =(data[pos[0] + 1]) << 24 & 0xff000000 |(data[pos[0] + 2]) << 16 & 0x00ff0000 |(data[pos[0] + 3]) << 8 & 0x0000ff00 |(data[pos[0] + 4]) << 0 & 0x000000ff;pos[0] += 5;TreeNode root = new TreeNode(val);root.left = helper(data, pos);root.right = helper(data, pos);return root;}
}
精简版:
public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuffer sb = new StringBuffer();preOrder(root, sb);return sb.toString();}private void preOrder(TreeNode root, StringBuffer sb) {if (root == null) sb.append("00000");else {int val = root.val;sb.append('1').append((char) (val >> 24)).append((char) ((val >> 16) & (0x00ff))).append((char) ((val >> 8) & (0x0000ff))).append((char) (val & (0x000000ff)));preOrder(root.left, sb);preOrder(root.right, sb);}}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {return helper(data.toCharArray(), new int[1]);}private TreeNode helper(char[] chs, int[] pos) {if (pos[0] >= chs.length) return null;if (chs[pos[0]] == '0') {pos[0] += 5;return null;}int val = chs[pos[0] + 1] << 24 | chs[pos[0] + 2] << 16 | chs[pos[0] + 3] << 8 | chs[pos[0] + 4];TreeNode root = new TreeNode(val);pos[0] += 5;root.left = helper(chs, pos);root.right = helper(chs, pos);return root;}
}
二、 二叉搜索树的序列化和反序列化
问题描述:
问题求解:
public class SerializeandDeserializeBST {// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuffer sb = new StringBuffer();preOrder(root, sb);return sb.toString();}byte[] intToByte(int val) {return new byte[]{(byte)(val >> 24),(byte)(val >> 16),(byte)(val >> 8),(byte)val};}void preOrder(TreeNode root, StringBuffer sb) {if (root != null) {byte[] tmp = intToByte(root.val);sb.append((char) tmp[0]).append((char) tmp[1]).append((char) tmp[2]).append((char) tmp[3]);preOrder(root.left, sb);preOrder(root.right, sb);}}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {return helper(data.toCharArray(), new int[]{0}, Integer.MIN_VALUE, Integer.MAX_VALUE);}private TreeNode helper(char[] data, int[] pos, int low, int high) {if(pos[0] >= data.length) return null;int val =data[pos[0] + 0] << 24 & (0xff000000) |data[pos[0] + 1] << 16 & (0x00ff0000) |data[pos[0] + 2] << 8 & (0x0000ff00) |data[pos[0] + 3] << 0 & (0x000000ff);if(val < low || val > high) return null;TreeNode root = new TreeNode(val);pos[0] += 4;root.left = helper(data, pos, low, val);root.right = helper(data, pos, val, high);return root;}int byteToInt(byte[] bytes) {returnbytes[0] & (0xff000000) |bytes[1] & (0x00ff0000) |bytes[2] & (0x0000ff00) |bytes[3] & (0x000000ff);}
}
转载于:https://www.cnblogs.com/TIMHY/p/9191122.html
序列化与反序列化二叉树相关推荐
- 序列化以及反序列化二叉树
有些问题需要把二叉树序列化,可用于传输或者保存等,当然,有些题目也需要你去序列化以及反序列化,你懂的! 二叉树的定义如下: package com.hbut.bean;public class Tre ...
- c语言二叉树反序列化,序列化和反序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode ...
- 序列化和反序列化二叉树 -----前序,中序,后序,层序
目录 一.序列化和反序列化 1.什么是序列化和反序列化 二.前序遍历 1.序列化 1.问题分析 2.代码实现 2.反序列化 1.问题分析 2.代码实现 三.后序遍历 1.序列化 1.思路分析 2.代码 ...
- python代码实现二叉树的序列化和反序列化
python代码实现二叉树的序列化和反序列化 二叉树的序列化 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字 符串,从而使得内存中建立起来的二叉树可以持久保存. 二叉树的反序 ...
- 二叉树序列化与反序列化相关题目(Leetcode题解-Python语言)
297. 二叉树的序列化与反序列化(剑指 Offer 37. 序列化二叉树)(剑指 Offer II 048. 序列化与反序列化二叉树) class Codec:def serialize(self, ...
- LeetCode——二叉树序列化与反序列化
文章目录 题目 思路 问题一 问题二 代码实现 题目 请实现两个函数,分别用来序列化和反序列化二叉树. 设计一个算法来实现二叉树的序列化与反序列化.不限定序列 / 反序列化算法执行逻辑,你只需要保证一 ...
- lintcode 7. 二叉树的序列化和反序列化 Python代码
'''7. 二叉树的序列化和反序列化 描述 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化 ...
- java二叉树的序列化_二叉树的序列化和反序列化
import java.util.LinkedList; import java.util.Queue; /** * 序列化和反序列化二叉树 * 先序.后序 * (中序不能实现) * 按层 */ pu ...
- C++之二叉树的序列化与反序列化
问题 来源: LintCode7 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为"序列化",读取文件后重建同样的二叉树被称为"反序列化" ...
- 剑指offer:二叉树序列化与反序列化 - Python
转载自:https://blog.csdn.net/u010005281/article/details/79787278 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树. 解题思路 序列化 ...
最新文章
- 前端部分面试题整理,欢迎补充
- Python解决NameError: name ‘reload‘ is not defined的问题
- 一个关于使用 $month,$dayOfMonth 进行按月/日统计的问题
- 如何用xapmm测试php_如何在Xampp中运行PHP程序?
- php+当前+日期+函数是,php时间日期的处理函数
- 输入一颗二元树,从上向下按层打印树的每个节点,同一层中,按照从左到右的顺序打印。...
- java工程师面试题:如何判断链表有环?
- 大坑:用SQLyog连mysql的部分操作不能同步到从库
- ADO.NET 对象模型
- linux man中文手册
- 第四天:使用 session cookie redis完善登录验证及登录路由
- Visual Studio 2008操作技巧
- 两台usrp实现收发_选购光纤收发器时应该注意哪些事项?
- Android 百度地图SDK与导航SDK相关问题
- Codeforces 918D - MADMAX
- MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)
- kvm最多能管几台服务器,高效管理500台服务器的kvm切换器配置方案
- parameter缩略语_WB 术语及缩略语表
- duilib学习------网易云信图片中间加文字
- 绝世舞姬计算机弹音乐,绝世舞姬(伴奏)