題目
序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。
請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 / 反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化爲一個字符串並且將這個字符串反序列化爲原始的樹結構。
示例:
你可以將以下二叉樹:
1
/ \
2 3
/ \
4 5
序列化爲 "[1,2,3,null,null,4,5]"
提示: 這與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode 序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。
說明: 不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。
鏈接:https://leetcode-cn.com/problems/serialize-and-deserialize-binary-tree
解題記錄
- 層序遍歷,前序遍歷,中序遍歷,後序遍歷都可以做,只要注意序列化和反序列化要使用同一種
- StringBuilder處理字符串會快很多
/**
* @author ffzs
* @describe
* @date 2020/6/16
*/
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
public class Codec {
public void serialize(TreeNode root, StringBuilder pre) {
if (root == null) {
pre.append("null,");
}else{
pre.append(root.val).append(",");
serialize(root.left, pre);
serialize(root.right, pre);
}
}
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder pre = new StringBuilder();
serialize(root, pre);
return pre.toString();
}
public TreeNode deserialize(Deque<String> stack){
if (stack.isEmpty() || stack.peek().equals("null")) {
stack.pop();
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(stack.pop()));
root.left = deserialize(stack);
root.right = deserialize(stack);
return root;
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Deque<String> stack = new LinkedList<String>(Arrays.asList(data.split(",")));
return deserialize(stack);
}
}