序列化是將一個數據結構或者對象轉換爲連續的比特位的操做,進而能夠將轉換後的數據存儲在一個文件或者內存中,同時也能夠經過網絡傳輸到另外一個計算機環境,採起相反方式重構獲得原數據。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));