剑指 Offer 37. 序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
你可以将以下二叉树:
1
/ \
2 3
/ \
4 5
序列化为 "[1,2,3,null,null,4,5]"
应当注意,这里的序列是层序遍历的序列。
注意一下字符串的处理就好了。数组尾有多余的null也没有关系,最后序列化和反序列是一对相反的操作。
public class Codec {
public String serialize(TreeNode root) {
if (root == null) return "[]";
StringBuilder res = new StringBuilder("[");
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (node != null) {
res.append(node.val + ","); //如果节点不是空,则附加 类似 1,
queue.add(node.left);
queue.add(node.right);
} else res.append("null,"); //如果为空 则附加 null,
}
res.deleteCharAt(res.length() - 1); 去除最后一个,
res.append("]");
return res.toString();
}
public TreeNode deserialize(String data) {
if (data.equals("[]")) return null;
String[] vals = data.substring(1, data.length() - 1).split(","); 变为: 1,2,3,null,4 这样的格式,并以,spilt给一个数组
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
int i = 1;
while (!queue.isEmpty()) {
TreeNode node = queue.poll();
if (!vals[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.left);
}
i++;
if (!vals[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(vals[i]));
queue.add(node.right);
}
i++;
}
return root;
}
}