思路:
1、用层序的方法遍历所有节点
2、用特定字符表示空节点,这里选择井号
3、用特定字符分隔各个节点的值,这里选择逗号
代码:
import java.util.*;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
String Serialize(TreeNode root) {
// 空树
if (root == null) return "#";
// StringBuilder 拼接字符
StringBuilder builder = new StringBuilder();
builder.append(root.val + "");
// 用层序遍历的方法遍历,借助队列保存每一层的节点
Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {
// 每一轮循环先记录节点数目,避免被后面入队的节点影响
int sz = q.size();
for (int i=0; i < sz; i++) {
TreeNode t = q.poll();
// 节点不为空,则记录节点的值,用 “,” 分隔开
if (t.left != null) {
q.offer(t.left);
builder.append("," + t.left.val);
}
// 节点为空,用 "#" 表示
else {
builder.append(",#");
}
// 同样方法处理右节点
if (t.right != null) {
q.offer(t.right);
builder.append("," + t.right.val);
}
else {
builder.append(",#");
}
}
}
return builder.toString();
}
TreeNode Deserialize(String str) {
// 根据 “,” 分隔各个值,返回值为 String 数组
String[] source = str.split(",");
// 第一个值就是 "#",说明是空树
if ("#".equals(source[0])) {
return null;
}
// 层序遍历,重新生成了树
Queue<TreeNode> q = new LinkedList<>();
TreeNode root = new TreeNode(Integer.valueOf(source[0]));
q.offer(root);
// 记录 source 数组访问到了哪个下标
int cnt = 1;
while (!q.isEmpty()) {
int sz = q.size();
for (int i=0; i < sz; i++) {
TreeNode t = q.poll();
if ("#".equals(source[cnt])) {
t.left = null;
}
else {
t.left = new TreeNode(Integer.valueOf(source[cnt]));
q.offer(t.left);
}
cnt++;
if ("#".equals(source[cnt])) {
t.right = null;
}
else {
t.right = new TreeNode(Integer.valueOf(source[cnt]));
q.offer(t.right);
}
cnt++;
}
}
return root;
}
}

京公网安备 11010502036488号