序列化是將一個數據結構或者對象轉換爲連續的比特位的操做,進而能夠將轉換後的數據存儲在一個文件或者內存中,同時也能夠經過網絡傳輸到另外一個計算機環境,採起相反方式重構獲得原數據。node
請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 / 反序列化算法執行邏輯,你只須要保證一個二叉樹能夠被序列化爲一個字符串而且將這個字符串反序列化爲原始的樹結構。算法
示例: 網絡
你能夠將如下二叉樹:數據結構
序列化爲 "[1,2,3,null,null,4,5]" ui
提示: 這與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並不是必須採起這種方式,你也能夠採用其餘的方法解決這個問題。spa
說明: 不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。設計
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 }