题目
设计一个算法实现二叉树的序列化和反序列化
分析
序列化:当前节点为null时候,返回“#”。当前节点为数字时,字符串累加数字+“!”。最后返回的字符串结果就是1!2!##3!#
反序列化:创建数组,使用!分割符号。然后将数组的值放入队列。队列的值弹出,先弹出头结点,如果是#则返回null,然后使用递归弹出head.left和head.right。(因为是递归,所以不用考虑循环问题。写一次的代码就思考一次的情况即可。)
代码
public static class TreeNode {
public int val;
public TreeNode left;
public TreeNode right;
public TreeNode(int data) {
this.val = data;
}
}
//先序序列化 null用#表示,每个节点之间用!相隔开
public static String serialByPre(TreeNode head) {
if (head == null) {
return "#!";
}
String res = head.val + "!";
res += serialByPre(head.left);
res += serialByPre(head.right);
return res;
}
//先序反序列化,将字符串放入数组中,按照!分割放入。
//队列能够方便知道建立到哪个位置。
public static TreeNode reconByPreString(String preStr) {
String[] values = preStr.split("!");
Queue<String> queue = new LinkedList<String>();
for (int i = 0; i != values.length; i++) {
queue.offer(values[i]);
}
return reconPreOrder(queue);
}
public static 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;
}