题解 | #序列化二叉树#
序列化二叉树
https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84
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) {
StringBuilder s = new StringBuilder();
Queue<TreeNode> seri = new LinkedList<>();
nodes.add(root);
while (!seri.isEmpty()) {
TreeNode node = seri.poll();
//空节点序列化
if (node.val == -1) {
s.append("#");
continue;
}
s.append(Integer.toString(node.val));
//标记一个节点值结束
s.append("-");
//空节点用val = -1的节点来表示
if (node.left == null) {
TreeNode dummy = new TreeNode(-1);
seri.add(dummy);
} else {
seri.add(node.right);
}
if (node.right == null) {
TreeNode dummy = new TreeNode(-1);
seri.add(dummy);
} else {
seri.add(node.right);
}
}
return s.toString();
}
public Queue<TreeNode> nodes = new LinkedList<>();
void BFS(TreeNode root) {
if (nodes.isEmpty()) return;
if (nodes.peek().val == -1) {
root.left = null;
nodes.poll();
} else {
root.left = nodes.poll();
BFS(root.left);
}
if (nodes.peek().val == -1) {
root.right = null;
nodes.poll();
} else {
root.right = nodes.poll();
BFS(root.right);
}
}
TreeNode Deserialize(String str) {
char[] c = str.toCharArray();
int front = -1;
for (int i = 0; i < c.length; i++) {
//在front已经有赋值的情况下
if (front != -1) {
if (c[i] == '-') {
int val = 0;
//得到节点值
for (int j = front; j < i; j++) {
val = val * 10 + (c[j] - '0');
}
//加入层次节点队列
nodes.add(new TreeNode(val));
//恢复front
front = -1;
}
continue;
}
if (c[i] == '#') {
nodes.add( new TreeNode(-1));
continue;
}
if (front == -1) {
if (c[i] >= '0' && c[i] <= '9') {
front = i;
}
}
}
TreeNode root = nodes.poll();
BFS(root);
return root;
}
}

