请实现两个函数,分别用来序列化和反序列化二叉树
怎么序列化的,就怎么反序列化。这里 deserialize
反序列化时对于序列化到 String[]arr
的哪个结点值来了的变量 index
有两个坑(都是笔者亲自踩的):
index
声明为成员的 int
, Java
中函数调用时不会改变基本类型参数的值的,因此不要企图使用 int
表示当前序列化哪个结点的值来了Integer
代替,但是 Integer
和 String
一样,都是不可变对象,所有的值更改操作在底层都是拆箱和装箱生成新的 Integer
,因此也不要使用 Integer
做序列化到哪一个结点数值来了的计数器int
变量)String Serialize(TreeNode root) { if(root == null){ return "#_"; } //处理头结点、左子树、右子树 String res = root.val + "_"; res += Serialize(root.left); res += Serialize(root.right); return res;}
TreeNode Deserialize(String str) { if(str == null || str.length() == 0){ return null; } Integer index = 0; return deserialize(str.split("_"), new int[]{0});}
//怎么序列化的,就怎么反序列化TreeNode deserialize(String[] arr, int[] index){ if("#".equals(arr[index[0]])){ index[0]++; return null; } //头结点、左子树、右子树 TreeNode root = new TreeNode(Integer.parseInt(arr[index[0]])); index[0]++; root.left = deserialize(arr, index); root.right = deserialize(arr, index); return root;}
出自:http://www.zhenganwen.top
已获授权
END