解题思路:层序遍历,遇到null就保存"#“,反序列化的时候同样遇到不是”#"的时候就new一个节点,最后返回根节点。时间复杂度O(N),空间复杂度O(N)。
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 null;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
StringBuilder sb = new StringBuilder();
while (!queue.isEmpty()) {
// 每次从队列中取出元素进行「拼接」,包括「正常节点」和「叶子节点对应的首位空节点」
TreeNode poll = queue.poll();
// 如果取出的节点不为「占位节点」,则继续往下拓展,同时防止「占位节点」不继续往下拓展
if (poll != null) {
sb.append(poll.val + ",");
queue.offer(poll.left != null ? poll.left : null);
queue.offer(poll.right != null ? poll.right : null);
} else {
sb.append("#,");
}
}
return sb.toString();
}
TreeNode Deserialize(String str) {
if (str == null) {
return null;
}
Queue<TreeNode> queue = new LinkedList();
String[] string = str.split(",");
//构建根节点并返回
TreeNode root = new TreeNode(Integer.parseInt(string[0]));
queue.offer(root);
//这里遍历string.length-1是因为最后一个是空字符串
for (int i = 1; i < string.length - 1; i += 2) {
TreeNode node = queue.poll();
String s1 = string[i], s2 = string[i + 1];
if (!s1.equals("#")) {
TreeNode left = new TreeNode(Integer.parseInt(s1));
queue.offer(left);
node.left = left;
}
if (!s2.equals("#")) {
TreeNode right = new TreeNode(Integer.parseInt(s2));
queue.offer(right);
node.right = right;
}
}
return root;
}
}
解法二:前序遍历,要用数组保存所有的值,因此时间复杂度O(N),空间复杂度O(N)。
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 null;
}
StringBuilder sb = new StringBuilder();
Serialize1(root, sb);
return sb.toString();
}
private void Serialize1(TreeNode root, StringBuilder sb) {
if (root == null) {
sb.append("#,");
return ;
}
sb.append(root.val + ",");
Serialize1(root.left, sb);
Serialize1(root.right, sb);
}
TreeNode Deserialize(String str) {
if (str == null) {
return null;
}
String[] string = str.split(",");
return Deserialize2(string);
}
int index = -1;
private TreeNode Deserialize2(String[] string) {
index++;
String str = string[index];
if (str.equals("#")) {
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(string[index]));
root.left = Deserialize2(string);
root.right = Deserialize2(string);
return root;
}
}```