题目:请实现两个函数,分别用来序列化和反序列化二叉树
解题思路:我们可以从前序遍历序列和中序遍历序列中构造出一颗二叉树。受此启发,我们可以先把一个二叉树序列化成前序序列和一个中序序列,然后在反序列化是通过这两个序列重构出原二叉树。这个思路有两个缺点:一是该方法要求二叉树中不能有数值重复的节点;二是只有当两个序列中的所有的数据都读出来后才能开会反序列化。如果两个遍历的序列流从一个流读出来的,那么可以需要等待较长的时间。实际上,如果二叉树的序列化是从根节点开始的,那么相应的反序列在根节点的数值读出来的时候就可以开始了。因此,我们可以根据前序遍历的顺序来序列化二叉树,因此前序遍历是从根节点开始的。在遍历二叉树碰到NullPtr指针时,这些nullPre序列化成一个特殊的字符(如‘$’)。另外,节点的数值之间要用一个特殊的字符(‘如,’)隔开。
package jianzhi_offer;
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
public class P37_Solution {
public int index = -1;
String Serialize(TreeNode root) {
StringBuffer sb = new StringBuffer();
if (root == null) {
sb.append("#,");
return sb.toString();
}
sb.append(root.val + ",");
sb.append(Serialize(root.left));
sb.append(Serialize(root.right));
return sb.toString();
}
TreeNode Deserialize(String str) {
index++;
int len = str.length();
if (index >= len) {
return null;
}
TreeNode root = null;
String[] str_arr = str.split(",");
if (!str_arr[index].equals("#")) {
root = new TreeNode(Integer.valueOf(str_arr[index]));
root.left = Deserialize(str);
root.right = Deserialize(str);
}
return root;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
}
}