7. 二叉树的序列化和反序列化

7. 二叉树的序列化和反序列化

设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。

如何反序列化或序列化二叉树是没有限制的,你只需要确保可以将二叉树序列化为一个字符串,并且可以将字符串反序列化为原来的树结构。

样例

样例 1:

输入:{3,9,20,#,#,15,7}

输出:{3,9,20,#,#,15,7}

解释:

二叉树 {3,9,20,#,#,15,7},表示如下的树结构:

3

/ \

9 20

/ \

15 7

它将被序列化为 {3,9,20,#,#,15,7}

样例 2:

输入:{1,2,3}

输出:{1,2,3}

解释:

二叉树 {1,2,3},表示如下的树结构:

1

/ \

2 3

它将被序列化为 {1,2,3}

我们的数据是进行 BFS 遍历得到的。当你测试结果 Wrong Answer 时,你可以作为输入调试你的代码。

你可以采用其他的方法进行序列化和反序列化。

注意事项

对二进制树进行反序列化或序列化的方式没有限制,LintCode 将您的 serialize 输出作为 deserialize 的输入,它不会检查序列化的结果

/**
* Definition of TreeNode:
* public class TreeNode {
*     public int val;
*     public TreeNode left, right;
*     public TreeNode(int val) {
*         this.val = val;
*         this.left = this.right = null;
*     }
* }
*/




public class Solution {
      /**
     * This method will be invoked first, you should design your own algorithm
     * to serialize a binary tree which denote by a root node to a string which
     * can be easily deserialized by your own "deserialize" method later.
     */
      public String serialize(TreeNode root) {
        // write your code here
        StringBuffer sb = new StringBuffer();
        preSerialization(root , sb);
        return sb.toString();
    }
    public static void preSerialization(TreeNode treeNode ,StringBuffer sb){
        if(treeNode == null){
            sb.append("#,");
        }else {
            sb.append(treeNode.val).append(",");
            preSerialization(treeNode.left, sb);
            preSerialization(treeNode.right, sb);
        }
    }


    /**
     * This method will be invoked second, the argument data is what exactly
     * you serialized at method "serialize", that means the data is not given by
     * system, it's given by your own serialize method. So the format of data is
     * designed by yourself, and deserialize it here as you serialize it in
     * "serialize" method.
     */
    public TreeNode deserialize(String data) {
        // write your code here
        String[] split = data.split(",");
        i=-1;
        return preDeserialization(split);
    }
    
    int i=-1;
    private  TreeNode preDeserialization(String[] split){
        TreeNode binTree;
        if( split[++i].equals("#")){
            binTree = null;
        }else{
            binTree = new TreeNode(Integer.parseInt(split[i]));
            binTree.left = preDeserialization( split );
            binTree.right = preDeserialization( split );
        }
        return binTree;
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时代我西

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值