题目描述
分析
题目并不复杂,关键是理解它并建立思路。序列化和反序列化无非是把对象转化为字符串形式存储和把字符串还原为对象这两个过程。看到序列化会想到遍历,二叉树;目标是字符串,那么就可以使用字符串拼接的方式。那么是否可以采用递归呢?可以的,在序列化的过程中,子节点和父节点具有相同的规律。在实现上,序列化时采用递归,对子树递归并把子树返回的字符串拼接在当前字符串后,最终返回总的字符串;反序列化时需要采用相同的规律,如果序列化是采用前序遍历,那么反序列化也应该采用前序遍历,反序列化需要设立一个指针,它的移动引领着字符串上节点数据的读取。另外在序列化和反序列化中,不要忘记对空字符串进行编码,可以采用“$,”符号,普通节点就用“val”+“,”。
序列化:
String Serialize(TreeNode root) {
StringBuilder build = new StringBuilder();
if(root == null) {
build.append("$,");
}else {
build.append(root.val + ",");
build.append(Serialize(root.left));
build.append(Serialize(root.right));
}
return build.toString();
}
反序列化中的指针移动:
while(str.charAt(index) != ','){
index ++;
}
反序列化读取val值:
int val = Integer.parseInt(str.substring(start, index));
反序列化先index++再递归:
int val = Integer.parseInt(str.substring(start, index));
node = new TreeNode(val);
index ++;
node.left = Deserialize(str);
node.right = Deserialize(str);
代码
public class Solution {
String Serialize(TreeNode root) {
StringBuilder build = new StringBuilder();
if(root == null) {
build.append("$,");
}else {
build.append(root.val + ",");
build.append(Serialize(root.left));
build.append(Serialize(root.right));
}
return build.toString();
}
int index = 0;
TreeNode Deserialize(String str) {
if(str.length() == 0 || index == str.length()){
return null;
}
TreeNode node = null;
int start = index;
while(str.charAt(index) != ','){
index ++;
}
if(!str.substring(start, index).equals("$")){
int val = Integer.parseInt(str.substring(start, index));
node = new TreeNode(val);
index ++;
node.left = Deserialize(str);
node.right = Deserialize(str);
}else {
index ++;
}
return node;
}
}