1. 程式人生 > 實用技巧 >297. 二叉樹的序列化與反序列化

297. 二叉樹的序列化與反序列化

序列化是將一個數據結構或者物件轉換為連續的位元位的操作,進而可以將轉換後的資料儲存在一個檔案或者記憶體中,同時也可以通過網路傳輸到另一個計算機環境,採取相反方式重構得到原資料。

請設計一個演算法來實現二叉樹的序列化與反序列化。這裡不限定你的序列 / 反序列化演算法執行邏輯,你只需要保證一個二叉樹可以被序列化為一個字串並且將這個字串反序列化為原始的樹結構。

示例:

你可以將以下二叉樹:

1
/ \
2 3
/ \
4 5

序列化為 "[1,2,3,null,null,4,5]"
提示:這與 LeetCode 目前使用的方式一致,詳情請參閱LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。

說明:不要使用類的成員 / 全域性 / 靜態變數來儲存狀態,你的序列化和反序列化演算法應該是無狀態的。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 
*/ public class Codec { private static String none="null"; private static String spliter=","; // Encodes a tree to a single string. public String serialize(TreeNode root) { StringBuilder sb=new StringBuilder(); buildString(root,sb); return sb.toString(); }
private void buildString(TreeNode node,StringBuilder sb){ if(node==null){ sb.append(none).append(spliter); return; } sb.append(node.val).append(spliter); buildString(node.left,sb); buildString(node.right,sb); } // Decodes your encoded data to tree. public TreeNode deserialize(String data) { Queue<String>q=new LinkedList<>(); q.addAll(Arrays.asList(data.split(spliter))); return buildTree(q); } private TreeNode buildTree(Queue<String>q){ String val=q.remove(); if(val.equals(none)){ return null; } TreeNode node=new TreeNode(Integer.valueOf(val)); node.left=buildTree(q); node.right=buildTree(q); return node; } } // Your Codec object will be instantiated and called as such: // Codec ser = new Codec(); // Codec deser = new Codec(); // TreeNode ans = deser.deserialize(ser.serialize(root));