Lc-449
categories: [LeetCode]
tags: [Tree, medium]
449. Serialize and Deserialize BST
题目大意:
序列化是指将数据结构或对象转化为一个以bits代表的序列目的是可以存储在文件或memory缓存中,
或者通过网络连接可以转传送到同一台或另一台计算机系统
设计一个算法实现序列化和反序列化一个二分搜索数,对于设计的序列化和反序列化没有任何限制,
你只需要确保将二分搜索数序列化成一个字符串, 再将字符串反序列化成原本的树。
解题思路:
首先对于序列化来说,将二分搜索数转化成字符串,我们可以利用二分搜索数的特征
进行前序遍历,并创建一个stringbuilder将每一个遍历到的结点的值保存在stringbuilder里
最后调用stringbuilder的内置方法toString() 返回成字符串
对于反序列化来说, 我们首先判断一下特殊条件, 如果需要反序列化的字符串为空,则返回null
接下来我们用字符串自带的split()方法将字符串中的每个字母用逗号隔开并以字符串类型将其放入我们创建好的队列中
然后我们调用helper function。
在helper function中我们同样先判断保存字符串的队列是否为空, 如果是, 返回null
如果不是,我们先将peek的字母拿出并将其保存在一个字符串自变量中,然后将其转化成整数类型保存
然后我们需要做一个判断, 如果保存的整数小于最小数或大于最大数, 同样返回null
接着创建一个TreeNode自变量并将保存的整数保存在TreeNode中。
这样我们就将队列中的第一个字母成功以TreeNode并作为root创建,
紧接着我们用recursion方式调用helper function去做root.left 和 root.right
最后我们返回root
注意:
String.split() 将string根据一些规则隔开成array
Arrays.asList() 将array变成list形式
peek() --> returns the head of this list, or null if this list is empty.
poll() --> returns head the of list and delete from list
复杂度:
Time Complexity: O(N)
Space Complexity: O(N)
Code示例:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
preOrder(root, sb);
return sb.toString();
}
// 前序遍历
public void preOrder(TreeNode root, StringBuilder sb) {
if (root == null) return;
sb.append(root.val).append(",");
preOrder(root.left, sb);
preOrder(root.right, sb);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (data.isEmpty()) return null;
Queue<String> q = new LinkedList<>(Arrays.asList(data.split(",")));
return helper(q, Integer.MIN_VALUE, Integer.MAX_VALUE);
}
public TreeNode helper(Queue<String> q, int lower, int upper) {
if (q.isEmpty()) return null;
String s = q.peek();
int val = Integer.parseInt(s);
if (val < lower || val > upper) return null;
q.poll();
TreeNode root = new TreeNode(val);
root.left = helper(q, lower, val);
root.right = helper(q, val, upper);
return root;
}
}
// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// String tree = ser.serialize(root);
// TreeNode ans = deser.deserialize(tree);
// return ans;