37. 序列化二叉树
1 题目描述
请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
2 题目分析
将二叉树编码成一个字符串形式(注:这里序列化按层序遍历进行序列化,剑指Offer中是前序遍历),例:
1
/ \
2 3
/ / \
4 5 6
序列化字符串后为:"1,2,3,4,null,5,6"
思路:层序遍历,对于每一层的空节点按null加入然后输出即可。
3 代码
/*
序列化二叉树
*/
class Codec {
// Encodes a tree to a single string.
/*
将二叉树编码成一个字符串形式(注:这里序列化按层序遍历进行序列化,剑指Offer中是前序遍历),例:
1
/ \
2 3
/ / \
4 5 6
序列化字符串后为:"1,2,3,4,null,5,6"
思路:层序遍历,对于每一层的空节点按null加入然后输出即可。
*/
public String serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
Deque<TreeNode> deque = new LinkedList<>();
if (root == null) return "[]";
deque.offerLast(root);
sb.append("[");
while (!deque.isEmpty()) {
TreeNode node = deque.poll();
if (node != null) {
sb.append(node.val + ",");
deque.offerLast(node.left);
deque.offerLast(node.right);
} else {
sb.append("null,");
}
}
sb.deleteCharAt(sb.length() - 1);
sb.append("]");
return sb.toString();
}
// Decodes your encoded data to tree.
/*
将字符串反序列化成二叉树,一个道理,遍历字符串,按照根,左,右的顺序构建二叉树,碰到null则什么也不操作
字符串为:"1,2,3,4,null,5,6",反序列化之后如下图
1
/ \
2 3
/ / \
4 5 6
*/
public TreeNode deserialize(String data) {
String[] values = data.substring(1, data.length() - 1).split(","); // 分割字符串
TreeNode root = new TreeNode(Integer.parseInt(values[0]));
Deque<TreeNode> queue = new LinkedList<>();
// 同样采用队列,根节点入队
queue.offerLast(root);
int i = 1;
while (!queue.isEmpty()) {
// 队列非空
/* TreeNode node = queue.poll();
// 如果当前节点为null,则不操作,不为空则进行连接并加入队列
if (!values[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(values[i]));
queue.offerLast(root.left);
}
i++;
// 同样右节点也是
if (!values[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(values[i]));
queue.offerLast(root.right);
}
i++;*/
TreeNode node = queue.poll();
if(!values[i].equals("null")) {
node.left = new TreeNode(Integer.parseInt(values[i]));
queue.add(node.left);
}
i++;
if(!values[i].equals("null")) {
node.right = new TreeNode(Integer.parseInt(values[i]));
queue.add(node.right);
}
i++;
}
return root;
}
}