297.二叉樹的序列化與反序列化
- 二叉樹的序列化與反序列化
難度困難176
序列化是將一個數據結構或者對象轉換爲連續的比特位的操作,進而可以將轉換後的數據存儲在一個文件或者內存中,同時也可以通過網絡傳輸到另一個計算機環境,採取相反方式重構得到原數據。
請設計一個算法來實現二叉樹的序列化與反序列化。這裏不限定你的序列 /
反序列化算法執行邏輯,你只需要保證一個二叉樹可以被序列化爲一個字符串並且將這個字符串反序列化爲原始的樹結構。示例:
你可以將以下二叉樹: 1 / \ 2 3 / \ 4 5 序列化爲 "[1,2,3,null,null,4,5]"
提示: 這與 LeetCode 目前使用的方式一致,詳情請參閱 LeetCode
序列化二叉樹的格式。你並非必須採取這種方式,你也可以採用其他的方法解決這個問題。說明: 不要使用類的成員 / 全局 / 靜態變量來存儲狀態,你的序列化和反序列化算法應該是無狀態的。
/*
* 思路:
1、序列化 創建一個builder 用 , 進行分隔 如果是null 則用 x 進行標記。
Tree -> 字符串
2、反序列化 使用雙端隊列進行添加搜索元素,x 說明是一個Null 跳過,否則的話 就直接 遞歸
查找遞歸root.left 和 root.right
*/
//構建字符串
private static final String spliter = ",";
private static final String NN = "x";
// Encodes a tree to a single string.
// 構建二叉樹序列化-》BST>String
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
buildString(root,sb);
return sb.toString();
}
private void buildString(TreeNode root,StringBuilder sb){
//root == null
if(root == null){ // x,
sb.append(NN).append(spliter);
}else{
sb.append(root.val).append(spliter);
buildString(root.left,sb);
buildString(root.right,sb);
}
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Deque<String> nodes = new LinkedList<>();
nodes.addAll(Arrays.asList(data.split(spliter)));
return buildTree(nodes);
}
public TreeNode buildTree(Deque<String> nodes){
String val = nodes.remove();
if(val.equals(NN)) return null;
else{
TreeNode node = new TreeNode(Integer.valueOf(val));
node.left = buildTree(nodes);
node.right = buildTree(nodes);
return node;
}
}