1. 程式人生 > >Leetcode 297.二叉樹的序列化和反序列化

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 }