1 题目描述
2 算法思路
2.1 序列化
序列化思路:
- 序列化,其实就是层序遍历,为了能够完整的体现序列化二叉树的信息,这里选择将所以叶子节点的null 节点都输出,因此会比题目中的null 要多,例如 4 和5 的null 值都会出现,但是这个并不影响
序列化算法:
- 特值:当root为空时,直接返回空列表
- 初始化:队列queue, 包含root
- 层序遍历:当queue为空时,就跳出
- 节点出队,记作node
- 如果节点不为空,就打印,并将左右子节点加入queue
- 如果为空,就打印“null”
- 返回值,拼接列表
2.2 反序列化
算法流程:
- 特值:当data为空时,直接返回null;
- 初始化:序列化列表 vals,去掉首尾的括号,以逗号分隔,队列queue,添加root
- 按层构建,当queue为空时跳出
- 将root节点入队,记为node
- 构建node的左子节点,node.left 值为 val[i] 并将node.left 入队 ,i++
- 构建node的右子节点,node.right 值为 val[i] ,并将node.right 入队, i++
- 返回root
3 代码
public class Codec {
// Encodes a tree to a single string.
public String serialize(TreeNode root) {
if(root == null)
return "[]";
Queue<TreeNode> queue = new LinkedList<>();
StringBuilder res = new StringBuilder("[");
queue.add(root);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(node != null){
res.append(node.val + ",");
queue.add(node.left);
queue.add(node.right);
}
else{
res.append("null,");
}
}
res.deleteCharAt(res.length() - 1); //删除最后一个逗号
res.append("]");
return res.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
if(data.equals("[]")) //字符串为空
return null;
String[] vals = data.substring(1,data.length() - 1).split(","); //将data去掉头尾括号后,按照逗号分隔
Queue<TreeNode> queue = new LinkedList<>();
TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
queue.add(root);
int i = 1;
while(!queue.isEmpty()){
TreeNode node = queue.poll();
if(!vals[i].equals("null")){ //当序列化字符串此时不为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;
}
}
4 提交结果