二叉树的序列化与反序列化
题目链接:二叉树的序列化与反序列化
思路:
- 这道题。。。真是让我处理了很久啊。
- 我的第一思路有两个,1.二叉树的层次遍历,再反序列化构造,这里就要求将二叉树当做完全二叉树遍历,空节点用“#”代替。第二个就是下面的错误思路。。。
- 错误思路:我记得之前刷过一题,二叉树先序和中序重造二叉树,那么在序列化时,我准备采用将二叉树先序遍历和中序遍历的结果放在一个字符串里,然后序列化时将其拆开即可,顺着这个思路,错误越出越多,其中序列化结果是字符串,后来提交发现二叉树中存在为负值的节点,这就导致我转化为整数出错,正确方式是在每一个节点值拼接之后都再加上“,”,回头再按“,”拆分,这样做按理讲虽然复杂,但是应该也能做出来,我自定义的二叉树进行验证都没有问题,但是提交时遇到一个复杂的二叉树导致我提交错误,至今未发现哪里的问题。
- 其实先序和中序我们知道其一就可以构造了,特殊的要求是null节点要用其他字符代替,这样我们就可以重造二叉树(之前一直以为一种遍历构造不出来)
- 下边的代码是递归写的,比较易懂,但是运行时间较长。
public class Codec {
int index = -1;
// Encodes a tree to a single string.
public 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));
System.out.println(sb.toString());
return sb.toString();
}
// Decodes your encoded data to tree.
public TreeNode deserialize(String data) {
String[] temp = data.split(",");
return deserialize(temp);
}
public TreeNode deserialize(String[] temp) {
++index;
TreeNode root = null;
if(!temp[index].equals("#")) {
root = new TreeNode(Integer.parseInt(temp[index]));
root.left = deserialize(temp);
root.right = deserialize(temp);
}
return root;
}
}