题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
代码实现
序列化
注意要点
- 每序列化一个结点数值后,都应加上一个结束符表示一个结点序列化的终止,包括空结点。如_或!
- 用一个占位符表示空结点的序列化,如#
/**
* 前序序列化
* 为空则#,两数之间间隔用!
*
* @param head
* @return
*/
public String Serialize(TreeNode root) {
if (root == null) {
return "#!";
}
String res = root.val + "!";
res += Serialize(root.left);
res += Serialize(root.right);
return res;
}
重建
注意要点
怎么序列化,就怎么反序列化
/**
* 从前序序列化字符串重建整个二叉树
*
* @param str
* @return
*/
public static TreeNode Deserialize(String str) {
String[] strings = str.split("!");
Queue<String> queue = new LinkedList<>();
for (String tmp : strings) {
queue.offer(tmp);
}
return reConByPreOrder(queue);
}
public static TreeNode reconByPreOrder(Queue<String> queue) {
//依次出队元素重建结点
String value = queue.poll();
//重建空结点,为#直接返回
if (value.equals("#")) {
return null;
}
//重建头结点和左右子树
Node head = new TreeNode(Integer.valueOf(value));
head.left = reconByPreOrder(queue);
head.right = reconByPreOrder(queue);
return head;
}