将二叉树序列化,转换为字符串,空的子树用n代替,这样不需要中序遍历也可以生成二叉树
生成二叉树递归返回树节点
public class Codec {
String encodeString;
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if (root == null)
return null;
//前序遍历
StringBuilder stringBuilder = new StringBuilder();
preSerialize(root, stringBuilder);
encodeString = stringBuilder.toString();
return encodeString;
}
private void preSerialize(TreeNode root, StringBuilder stringBuilder) {
stringBuilder.append(root == null ? "n" : root.val);
if (root == null)
return;
preSerialize(root.left, stringBuilder);
preSerialize(root.right, stringBuilder);
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if (encodeString == null || ("").equals(encodeString))
return null;
char[] chars = encodeString.toCharArray();
TreeNode root = preDeserialize(chars, new int[]{-1});
return root;
}
// 21nn3nn
private TreeNode preDeserialize(char[] chars, int[] position) {
position[0] += 1;
if (position[0] == chars.length || chars[position[0]] == 'n')
return null;
TreeNode root = new TreeNode((int) chars[position[0]] - '0');
root.left = preDeserialize(chars,position);
root.right = preDeserialize(chars,position);
return root;
}
}