题目:
请实现两个函数,分别用来序列化和反序列化二叉树
思路:
序列化思路:
如果二叉树的序列化是从根节点开始的话,那么相应的反序列化在根节点的数值对出来的时候就可以开始了,因此我们可以根据前序遍历的的根节点数值在读出来的时候就可以开始了,因此我们可以根据前序遍历的顺序来序列化二叉树,因为前序遍历是从根节点开始的。当在遍历二叉树碰到NULL指针时,这些NULL指针序列化成一个特殊的字符(比如‘$’)。另外,节点的数字之间要用一个特殊字符(‘,’)隔开。–《剑指offer》
反序列化:根据序列化得到的序列重建二叉树
代码:
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int index = -1;//反序列化时,遍历数组的下标
String Serialize(TreeNode root) {
StringBuilder sb = new StringBuilder();
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) {
int length = str.length();
String [] strArray = str.split(",");
++index;
if(index >= length){
return null;
}
TreeNode pRoot = null;
if(!strArray[index].equals("$")){
pRoot = new TreeNode(Integer.valueOf(strArray[index]));
pRoot.left = Deserialize(str);
pRoot.right = Deserialize(str);
}
return pRoot;
}
}