Leetcode 297.二叉树的序列化和反序列化

二叉树地序列化和反序列化

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

示例

你可以将以下二叉树:

序列化为 "[1,2,3,null,null,4,5]"

提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。

说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。

 1 public class Codec {
 2     // Encodes a tree to a single string.
 3     public List<Integer> serialize(TreeNode root) {
 4         List<Integer> res = new ArrayList<>();
 5         dfs(res, root);
 6         return res;
 7     }
 8
 9     private void dfs(List<Integer> res, TreeNode root) {
10         if (root == null) {
11             res.add(null);
12         } else {
13             res.add(root.val);
14             dfs(res, root.left);
15             dfs(res, root.right);
16         }
17     }
18
19     // Decodes your encoded data to tree.
20     public TreeNode deserialize(List<Integer> data) {
21         int index[] = {0};
22         TreeNode root = build(index, data);
23         return root;
24     }
25
26     private TreeNode build(int[] index, List<Integer> data) {
27         Integer val = data.get(index[0]);
28         index[0] = index[0] + 1;
29         if (val == null) {
30             return null;
31         } else {
32             TreeNode node = new TreeNode(val);
33             node.left = build(index, data);
34             node.right = build(index, data);
35             return node;
36         }
37     }
38 }

原文地址:https://www.cnblogs.com/kexinxin/p/10205007.html

时间: 2024-10-03 13:27:52

Leetcode 297.二叉树的序列化和反序列化的相关文章

leetcode 297二叉树的序列化与反序列化

采用层序遍历的顺序,储存每一层的值,不存在的或者NULL值用#代替,每个位置以'/'结束 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Codec { public: // Encodes

Leetcode 297. 二叉树的序列化与反序列化

/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ #include <stringstream> class Codec { public: void serialize(TreeNode* root,

lintcode 中等题:binary tree serialization 二叉树的序列化和反序列化

题目 二叉树的序列化和反序列化 设计一个算法,并编写代码来序列化和反序列化二叉树.将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”. 如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构. 样例 给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构: 3 / 9 20 / 15 7 我们的数据是进行BFS遍历得到的.当你测试结果wrong answer时,你可以作为输

二叉树的序列化和反序列化(先序,按层序列化),包含递归图

目录 二叉树的序列化与反序列化 按层序列化 使用#!和!的原因: 二叉树的序列化与反序列化 序列化:将对象的状态信息转换为可以存储或传输的形式的过程 二叉树的序列化:就是将二叉树转换成字符串 二叉树的反序列化:通过字符串还原一棵二叉树,返回树的头节点. 先序序列化二叉树 上面这棵树的先序序列化结果为5!3!2!1!#!#!#!4!#!#!8!7!6!#!#!#!10!9!#!#!11!#!#! 从上图中我们可以看出在节点为空的位置使用"#!"来代替,每个节点后的数值都添加一个"

二叉树的序列化和反序列化

http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍历二叉树,如果遇到空节点,就在str的末尾加上"#!","#"表示这个节点为空,节点值不存在,当然你也可以用其他的特殊字符,"!"表示一个值的结束.如果遇到不为空的节点,假设节点值为3,就在str的末尾加上"3!".现在请你实现树的先序序列化. 先序遍历 import java.util.*; //使用递归

二叉树的序列化与反序列化

一个二叉树被序列化为数组,如何反序列化,也就是如何从序列化好的一个数组恢复成二叉树? 在上一篇文章中讲述了如何将一个有序数组创建成一个二叉搜索树,那么如果将将一个儿茶搜索树序列化为一个有序数组,然后按照上面的方法在反序列化即可.对二叉搜索树进行中序遍历即可得到一个有序的数组,那么上篇文章已经完成了对二叉搜索树的序列化和反序列化.同时如果想将二叉搜索树的序列化和反序列化的结果通过文件读取,也是同样的道理. 设计一个算法,将一棵二叉搜索树(Binary Search Tree,BST)保存到文件中,

二叉树的序列化、反序列化

一. 使用先序遍历的方式 [1]中的方式是采用设定#的方式,当访问读取了#时候,创建null,返回. 二.二叉搜索树的序列化 二叉搜索树具有的有序的性质,可以利用这个性质来递归的反序列化BST 对当前节点要处理的数据的范围设定一个边界,当读取的值是在这个范围里面的时候,则进行node的创建,否则创建NULL节点,对于值的node创建需要递归到上一层递归,寻找新的方案,如果还是不行,以此类推. [1] http://blog.csdn.net/pi9nc/article/details/97016

树(7)-----二叉树的序列化和反序列化

1.序列化:层次遍历[用字符串来存储] 2.反序列化:用队列存已经建立的节点,从序列化后的字符串列表取数来建立树 def serialize(self, root): """Encodes a tree to a single string. :type root: TreeNode :rtype: str """ if not root: return "" prev,strres=[root],"" w

LeetCode 297.序列化二叉树 - JavaScript

题目描述 序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据. 请设计一个算法来实现二叉树的序列化与反序列化.这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构. 说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的. 序列化二叉树思路 使用广度优先(