449-Serialize and Deserialize BST
Description
Serialization is the process of converting a data structure or object into a sequence of bits so that it can be stored in a file or memory buffer, or transmitted across a network connection link to be reconstructed later in the same or another computer environment.
Design an algorithm to serialize and deserialize a binary search tree. There is no restriction on how your serialization/deserialization algorithm should work. You just need to ensure that a binary search tree can be serialized to a string and this string can be deserialized to the original tree structure.
The encoded string should be as compact as possible.
Note: Do not use class member/global/static variables to store states. Your serialize and deserialize algorithms should be stateless.
問題描述
對二叉排序樹進行序列化和反序列化
注意, 不要使用成員變數, 全域性變數, 靜態變數來儲存狀態。
問題分析
使用前序遍歷進行序列化
在反序列化的過程中, 注意上界和下界
解法1
public class Codec {
private static final String spliter = ",";
// Encodes a tree to a single string.
public String serialize(TreeNode root){
if(root == null) return null;
StringBuilder sb = new StringBuilder();
preorder(root, sb);
return sb.toString();
}
private void preorder(TreeNode root, StringBuilder sb){
if(root == null) return;
sb.append(root.val).append(spliter);
preorder(root.left, sb);
preorder(root.right, sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data){
if(data == null || data.length() == 0) return null;
String[] sa = data.split(spliter);
int[] index = new int[]{0};
return helper(sa, index, Long.MIN_VALUE, Long.MAX_VALUE);
}
// construct BST from preorder order traversal;
private TreeNode helper(String[] sa, int[] index, long min, long max){
if(index[0] >= sa.length) return null;
TreeNode root = null;
int rootValue = Integer.parseInt(sa[index[0]]);
if(rootValue > min && rootValue < max){
root = new TreeNode(rootValue);
index[0]++;
root.left = helper(sa, index, min, rootValue);
root.right = helper(sa, index, rootValue, max);
}
return root;
}
}
解法2
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
serializeHelper(sb, root);
return sb.toString();
}
private void serializeHelper(StringBuilder sb, TreeNode root) {
if(root == null) return;
sb.append((char)root.val);
serializeHelper(sb, root.left);
serializeHelper(sb, root.right);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
Queue<Character> queue = new LinkedList();
for(Character ch: data.toCharArray()) queue.offer(ch);
return deserializeHelper(queue, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
private TreeNode deserializeHelper(Queue<Character> queue, int min, int max) {
if(queue.isEmpty() || Integer.valueOf(queue.peek()) >= max) return null;
int val = Integer.valueOf(queue.poll());
TreeNode root = new TreeNode(val);
root.left = deserializeHelper(queue, min, val);
root.right = deserializeHelper(queue, val, max);
return root;
}
}
相關文章
- 樹-BST基本實現
- [LeetCode] 776. Split BSTLeetCode
- 450-Delete Node in a BSTdelete
- 538-Convert BST to Greater Tree
- [LeetCode] 230. Kth Smallest Element in a BSTLeetCode
- LeetCode之Convert BST to Greater Tree(Kotlin)LeetCodeKotlin
- 653-Two Sum IV - Input is a BST
- 二叉堆、BST 與平衡樹
- 從BST到LSM的進階之路
- JSON parse error: Cannot deserialize value of type `java.time.LocalDateTime` from StringJSONErrorJavaLDA
- 二叉排序樹BST及CRUD操作排序
- 學習筆記——二叉平衡樹(BST)筆記
- 資料結構☞二叉搜尋樹BST資料結構
- 用PHP來實現二分搜尋樹(BST)PHP
- LeetCode 297. Serialize and Deserialize Binary Tree 二叉樹序列化反序列化LeetCode二叉樹
- 二叉樹(BST)中序遍歷的三種方法二叉樹
- 【Algorithm&DataStructure】二叉查詢樹(BST)的遍歷GoASTStruct
- Jaskson精講第6篇-自定義JsonSerialize與Deserialize實現資料型別轉換JSON資料型別
- 使用JS去實現一個BST(二叉查詢樹)JS
- 看動畫學演算法之:二叉搜尋樹BST動畫演算法
- 『資料結構與演算法』二叉查詢樹(BST)資料結構演算法
- 前端學習資料結構1 二分排序樹(BST)前端資料結構排序
- BST查詢結構與折半查詢方法的實現與實驗比較
- leetcode 530. Minimum Absolute Difference in BST二叉搜尋樹的最小絕對差 (簡單)LeetCode
- leetcode 450. delete-node-in-a-bst 刪除二叉搜尋樹中的節點 python3LeetCodedeletePython
- BST(二叉搜尋樹)、AVL樹、紅黑樹、2-3樹、B樹、B+樹、LSM樹、Radix樹比較