请实现两个函数,分别用来序列化和反序列化二叉树
怎么序列化的,就怎么反序列化。这里 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