Nowcoder java-序列化二叉树
(题目来自牛客网)
思路
前序序列化,那么反序列化时也必须是前序;
中序序列化,那么反序列化时也必须是中序;
后序序列化,那么反序列化时也必须是后序;
层序序列化,那么反序列化时也必须是层序;
所以说:怎么序列化就怎么反序列化
代码
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
public class SerializeAndDeserialize {
/**
* 前序遍历序列化
* 每个结点用"_"分割开,空结点用"#"表示
*/
String Serialize(TreeNode root) {
if (root == null) {
return "#_";
}
String res = root.val + "_";
res += Serialize(root.left);
res += Serialize(root.right);
return res;
}
/**
* 将序列化字符串装入一个queue中
*/
TreeNode Deserialize(String str) {
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, str.split("_"));
return Deserialize(queue);
}
/**
* 前序遍历反序列化
* 从队列中取出一个判断是否是"#",如果是表示该结点为null,否则新建结点
*/
private TreeNode Deserialize(Queue<String> queue) {
String string = queue.poll();
if (string.equals("#")) {
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(string));
root.left = Deserialize(queue);
root.right = Deserialize(queue);
return root;
}
}