序列化是将一个数据结构或者对象转换为连续的比特位的操做,进而能够将转换后的数据存储在一个文件或者内存中,同时也能够经过网络传输到另外一个计算机环境,采起相反方式重构获得原数据。java
请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只须要保证一个二叉树能够被序列化为一个字符串而且将这个字符串反序列化为原始的树结构。node
示例:算法
你能够将如下二叉树:网络
1 / \ 2 3 / \ 4 5
序列化为 “[1,2,3,null,null,4,5]”
提示: 这与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并不是必须采起这种方式,你也能够采用其余的方法解决这个问题。数据结构
说明: 不要使用类的成员 / 全局 / 静态变量来存储状态,你的序列化和反序列化算法应该是无状态的。app
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */ public class Codec { public String serialize(TreeNode root) { //用StringBuilder StringBuilder res = ser_help(root, new StringBuilder()); return res.toString(); } public StringBuilder ser_help(TreeNode root, StringBuilder str){ if(null == root){ str.append("null,"); return str; } str.append(root.val); str.append(","); str = ser_help(root.left, str); str = ser_help(root.right, str); return str; } public TreeNode deserialize(String data) { String[] str_word = data.split(","); List<String> list_word = new LinkedList<String>(Arrays.asList(str_word)); return deser_help(list_word); } public TreeNode deser_help(List<String> li){ if(li.get(0).equals("null")){ li.remove(0); return null; } TreeNode res = new TreeNode(Integer.valueOf(li.get(0))); li.remove(0); res.left = deser_help(li); res.right = deser_help(li); return res; } } // Your Codec object will be instantiated and called as such: // Codec codec = new Codec(); // codec.deserialize(codec.serialize(root));