首页
学习
活动
专区
圈层
工具
发布

每天一道剑指offer-序列化二叉树

序列化二叉树

题目描述

请实现两个函数,分别用来序列化和反序列化二叉树

解析

怎么序列化的,就怎么反序列化。这里 deserialize反序列化时对于序列化到 String[]arr的哪个结点值来了的变量 index有两个坑(都是笔者亲自踩的):

  1. index声明为成员的 intJava中函数调用时不会改变基本类型参数的值的,因此不要企图使用 int表示当前序列化哪个结点的值来了
  2. 之后笔者想用 Integer代替,但是 IntegerString一样,都是不可变对象,所有的值更改操作在底层都是拆箱和装箱生成新的 Integer,因此也不要使用 Integer做序列化到哪一个结点数值来了的计数器
  3. 最好使用数组或者自定义的类(在类中声明一个 int变量)
代码语言:javascript
复制
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

下一篇
举报
领券