297. Serialize and Deserialize Binary Tree
题目:
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary tree can be serialized to a string and this string can be deserialized to the original tree structure.
For example, you may serialize the following tree
1
/ \
2 3
/ \
4 5
as "[1,2,3,null,null,4,5]"
, just the same as how LeetCode OJ serializes a binary tree. You do not necessarily need to follow this format, so please be creative and come up with different approaches yourself.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
链接: http://leetcode.com/problems/serialize-and-deserialize-binary-tree/
题解:
序列化Binary Tree。 这里因为给定的Tree的val是Integer,所以我们可以用一个字符型的常量当做delimiter,比如','。然后我们可以使用两种方法, pre-order traversal,或者level-order traversal。两种方法的时间复杂度和空间复杂度都一样。下面是pre-order traversal的:
Time Complexity - O(n), Space Compleixty - O(n)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
private final String delimiter = ",";
private final String emptyNode = "#"; // Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
serialize(root, sb);
return sb.toString();
} private void serialize(TreeNode root, StringBuilder sb) {
if(root == null) {
sb.append(emptyNode).append(delimiter);
} else {
sb.append(root.val).append(delimiter);
serialize(root.left, sb);
serialize(root.right, sb);
}
} // Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Deque<String> nodes = new LinkedList<>();
nodes.addAll(Arrays.asList(data.split(delimiter)));
return deserialize(nodes);
} private TreeNode deserialize(Deque<String> nodes) {
String nodeVal = nodes.pollFirst();
if(nodeVal.equals(emptyNode)) {
return null;
} else {
TreeNode node = new TreeNode(Integer.parseInt(nodeVal));
node.left = deserialize(nodes);
node.right = deserialize(nodes);
return node;
}
}
} // Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
二刷:
总的来说就是用in-order traversal来遍历。 Serialize的时候用一个StringBuilder保存。 Deserialize的时候先根据delimiter把元素都split到一个String[]数组里,然后可以把元素放入queue中,接下来递归使用in-order traversal方法来重建树。重建时每次从queue的前部poll()就可以了。
Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
private final String delimiter = ",";
private final String nullNode = "#"; // Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
serialize(root, sb);
//sb.setLength(sb.length() - 1);
return sb.toString();
} private void serialize(TreeNode root, StringBuilder sb) {
if (root == null) {
sb.append(nullNode).append(delimiter);
} else {
sb.append(root.val).append(delimiter);
serialize(root.left, sb);
serialize(root.right, sb);
}
} // Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data == null) return null;
String[] strs = data.split(delimiter);
Queue<String> q = new LinkedList<>();
Collections.addAll(q, strs);
return deserialize(q);
} private TreeNode deserialize(Queue<String> q) {
if (q.isEmpty()) return null;
String val = q.poll();
if (val.equals(nullNode)) return null;
TreeNode node = new TreeNode(Integer.valueOf(val));
node.left = deserialize(q);
node.right = deserialize(q);
return node;
}
} // Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
三刷:
还是使用了in-order traversal。要注意delimiter假如使用'|'会报错,也不知道为什么。
Java:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
private final String nullNode = "#";
private final String delimiter = ","; // Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
serialize(root, sb);
return sb.toString();
} private void serialize(TreeNode root, StringBuilder sb) {
if (root == null) {
sb.append(nullNode).append(delimiter);
return;
}
sb.append(root.val).append(delimiter);
serialize(root.left, sb);
serialize(root.right, sb);
} // Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Queue<String> q = new LinkedList<>();
Collections.addAll(q, data.split(delimiter));
return deserialize(q);
} private TreeNode deserialize(Queue<String> q) {
if (q.isEmpty()) return null;
String s = q.poll();
TreeNode root = null;
if (!s.equals(nullNode)) {
root = new TreeNode(Integer.valueOf(s));
root.left = deserialize(q);
root.right = deserialize(q);
}
return root;
}
} // Your Codec object will be instantiated and called as such:
// Codec codec = new Codec();
// codec.deserialize(codec.serialize(root));
Reference:
http://articles.leetcode.com/2010/09/serializationdeserialization-of-binary.html
http://articles.leetcode.com/2010/09/saving-binary-search-tree-to-file.html
https://leetcode.com/discuss/66147/recursive-preorder-python-and-c-o-n
https://leetcode.com/discuss/66117/easy-to-understand-java-solution
https://leetcode.com/discuss/66698/java-bfs-based-accepted-solution-using-queue
https://leetcode.com/discuss/66181/easy-to-understand-java-solution
https://leetcode.com/discuss/69390/simple-solution-%23preorder-traversal-%23recursive-%23simple-logic
https://leetcode.com/discuss/66077/c-accepted-o-n-easy-solution
https://leetcode.com/discuss/66397/java-stack-based-solution-using-json
https://leetcode.com/discuss/66076/java-solution-with-queue
https://leetcode.com/discuss/66625/a-level-order-traversal-solution
https://leetcode.com/discuss/66141/a-48-ms-rough-c-solution-used-queue
297. Serialize and Deserialize Binary Tree的更多相关文章
- 【LeetCode】297. Serialize and Deserialize Binary Tree 解题报告(Python)
[LeetCode]297. Serialize and Deserialize Binary Tree 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode ...
- LC 297 Serialize and Deserialize Binary Tree
问题: Serialize and Deserialize Binary Tree 描述: Serialization is the process of converting a data stru ...
- LeetCode OJ 297. Serialize and Deserialize Binary Tree
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- [leetcode]297. Serialize and Deserialize Binary Tree 序列化与反序列化二叉树
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- 297. Serialize and Deserialize Binary Tree *HARD*
Serialization is the process of converting a data structure or object into a sequence of bits so tha ...
- 297. Serialize and Deserialize Binary Tree二叉树的序列化和反序列化(就用Q)
[抄题]: Serialization is the process of converting a data structure or object into a sequence of bits ...
- 【LeetCode】297. Serialize and Deserialize Binary Tree
二叉树的序列化与反序列化. 如果使用string作为媒介来存储,传递序列化结果的话,会给反序列话带来很多不方便. 这里学会了使用 sstream 中的 输入流'istringstream' 和 输出流 ...
- 297 Serialize and Deserialize Binary Tree 二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据.请设计一个算法来实现二叉树 ...
- Leetcode 297. Serialize and Deserialize Binary Tree
https://leetcode.com/problems/serialize-and-deserialize-binary-tree/ Serialization is the process of ...
随机推荐
- java笔试题(1)
char型变量中能不能存贮一个中文汉字? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没 ...
- android 开发 讯飞语音唤醒功能
场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面) 技术要点: 1. // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立 ...
- 【Unique Binary Search Trees II】cpp
题目: Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. F ...
- 用Chrome devTools 调试Android手机app中的web页面。
(1) 手机要满足Android系统为4.4或更高版本,低版本不支持这种方式.(2) 确保App已经开启了webview的debug调试模式,由Android工程师协助.(2) 用usb数据线连接好手 ...
- Posix线程编程指南(5) 杂项
在Posix线程规范中还有几个辅助函数难以归类,暂且称其为杂项函数,主要包括pthread_self().pthread_equal()和pthread_once()三个,另外还有一个LinuxThr ...
- 【BZOJ】【2705】【SDOI2012】Longge的问题
欧拉函数/狄利克雷卷积/积性函数 2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1275 Solv ...
- log4j 配置实例
1. http://hehongwei44.iteye.com/blog/1494999 2. http://maymay.iteye.com/blog/1275432 #log4j.rootLogg ...
- UML教程首页(转载)
UML是一种标准语言,用于指定,可视化,构造和文档的软件系统的文物. UML是OMG在1997年1月提出了创建由对象管理组和UML1.0规范草案. 本教程给出了一个比较完整的学习理解UML,可以方便学 ...
- Java读取图片并修改像素,创建图片
public void replaceImageColor(String file, Color srcColor, Color targetColor) throws IOException{ UR ...
- POJ3164 Command Network(最小树形图)
图论填个小坑.以前就一直在想,无向图有最小生成树,那么有向图是不是也有最小生成树呢,想不到还真的有,叫做最小树形图,网上的介绍有很多,感觉下面这个博客介绍的靠谱点: http://www.cnblog ...