序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。
设计一个算法来序列化和反序列化 二叉搜索树 。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。
用前序遍历存放二叉搜索树,得到的数组nums有以下特点:
1.第一个节点为根节点,即nums[0]
2.根节点右边部分的数组可拆分成两个数组,假设拆分的数组下标为:[1,a],[a+1,nums.length-1],
则[1,a]这个数组的值均小于nums[0],且它们构成了nums[0]的左子树;
同理[a+1,nums.length-1]的值均大于nums[0],它们构成了nums[0] 的右子树
用这个思想带入递归,不断求得节点的左右子树,就可以构造完整的树了
?
public class Codec {
// Encodes a tree to a single string.
StringBuilder builder=new StringBuilder();
public String serialize(TreeNode root) {
if(root==null) return "";
getBuilder(root);
System.out.print(builder.toString());
return builder.toString().substring(0,builder.length()-1);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if("".equals(data)) return null;
String[] dataString=data.split(",");
int[] nums=new int[dataString.length];
for(int i=0;i<nums.length;i++){
nums[i]=Integer.parseInt(dataString[i]);
}
return getTree(nums,0,nums.length-1);
}
private TreeNode getTree(int[] nums,int rootBegin,int rootEnd){
if(rootBegin==-1) return null;
TreeNode root=new TreeNode(nums[rootBegin]);
int l=rootBegin+1;
if(l>rootEnd || nums[l]>nums[rootBegin]) l=-1;
int r=0;
for(r=rootBegin+1;r<=rootEnd;r++){
if(nums[r]>nums[rootBegin]) break;
}
if(r==rootEnd+1) r=-1;
int lend=r==-1? rootEnd:r-1;
root.left=getTree(nums,l,lend);
root.right=getTree(nums,r,rootEnd);
return root;
}
private void getBuilder(TreeNode root){
if(root==null) return;
builder.append(root.val);
builder.append(',');
getBuilder(root.left);
getBuilder(root.right);
}
}
|