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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/xwdrhgr/article/details/102738086

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;
    }
}

猜你喜欢

转载自blog.csdn.net/xwdrhgr/article/details/102738086