二叉树的序列化与反序列化
2018-07-04 本文已影响1人
SHAN某人
1. 前言:为何要做序列化?
树这种数据结构存在内存中,序列化能够解决机器断电时在持久化存储介质中存储树的结构与数据的问题。
简单来说
- 内存 (序列化) ----> 磁盘
- 磁盘 (反序列化) ----> 内存
序列化也可以帮助我们很好的构建一颗二叉树,OJ平台通过树的序列化来比对输出的结果的正确性。
2. 先序序列化一颗树
// 二叉树的先序序列化
public String SerializeTreeByFirstOrder(TreeNode root) {
if (root == null) return "#_";
StringBuilder str = new StringBuilder();
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pop();
if (node == null) {
str.append("#_");
} else {
str.append(node.val);
str.append("_"); // 节点终止符
stack.push(node.right);
stack.push(node.left);
}
}
return str.toString();
}
3. 先序反序列化一颗树
// 二叉树的先序反序列化
public TreeNode DerializeTreeByFirstOrder(String str) {
if ("#_".equals(str)) return null;
Queue<String> queue = new LinkedList<>();
for (char c : str.toCharArray()) {
if ('_' == c) continue;
queue.add(String.valueOf(c));
}
return reconPreOrder(queue);
}
// 二叉树的先序反序列化
public TreeNode reconPreOrder(Queue<String> queue) {
String value = queue.poll();
if (value.equals("#")) {
return null;
}
TreeNode head = new TreeNode(Integer.valueOf(value));
head.left = reconPreOrder(queue);
head.right = reconPreOrder(queue);
return head;
}
其他遍历次序也可以来序列化和反序列一颗二叉树,只要序列化和反序列的顺序保持一致即可