设计一个算法,并编写代码来序列化和反序列化二叉树。
将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
如果二叉树的序列化是从根节点开始,那么对应的而反序列化也是从根节点开始的。因此可以使用二叉树的前序遍历来序列化二叉树,当前序遍历碰到null值是,使用“#”表示,每一个节点的数值之间用“,”隔开。
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int index = -1; // 节点在序列中的索引
/**
* 序列化
* 前序遍历,将二叉树节点的值转为字符序列,null转为“#”
*
* @param root
* @return
*/
String Serialize(TreeNode root) {
StringBuffer s = new StringBuffer();
if (root == null) {
s.append("#,");
return s.toString();
}
s.append(root.val + ",");
s.append(Serialize(root.left));
s.append(Serialize(root.right));
return s.toString();
}
/**
* 反序列化
*
* @param str
* @return
*/
TreeNode Deserialize(String str) {
index++;
int length = str.length();
if (index >= length) {
return null;
}
String[] nodeSeq = str.split(",");
TreeNode pNode = null;
if (!nodeSeq[index].equals("#")) {
pNode = new TreeNode(Integer.valueOf(nodeSeq[index]));
pNode.left = Deserialize(str);
pNode.right = Deserialize(str);
}
return pNode;
}
}
StringBuilder类可以用于在无需创建一个新的字符串对象情况下修改字符串。
在 StringBuilder 上的主要操作是 append 和 insert 方法。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符添加或插入到字符串生成器中。append 方法始终将这些字符添加到生成器的末端;而 insert 方法则在指定的点添加字符。