序列化格式:子节点为空用特殊符号表示,且节点与节点之间的用都逗号隔开
反序列化:递归先处理左右子树,化整为零
/**
* 序列化
*/
public static String serializeTree(Node root) {
if (root == null) {
return null;
}
String s = doSerializeTree(root);
return s.substring(0,s.length() - 1);
}
private static String doSerializeTree(Node root) {
String s = "";
s += (root.val) + ",";
s += root.left == null ? "#," : doSerializeTree(root.left);
s += root.right == null ? "#," : doSerializeTree(root.right);
return s;
}
/**
* 反序列化
*
*/
static Node deSerialize(String str) {
if (str == null || str == "") {
return null;
}
char[] cs = str.toCharArray();
return doDeSerialize(cs);
}
static int cur = 0;
private static Node doDeSerialize(char[] cs) {
if (cur == cs.length || cs[cur] == '#') {
return null;
}
Node tmp = new Node(Integer.valueOf(cs[cur] +""));
cur += 2; // 跳过逗号
Node left = doDeSerialize(cs);
cur += 2;
Node right = doDeSerialize(cs);
tmp.left = left;
tmp.right = right;
return tmp;
}