LintCode-7二叉树的序列化和反序列化

题目

描述

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

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

样例

给出一个测试数据样例, 二叉树{3,9,20,#,#,15,7},表示如下的树结构:

  3
 / \
9  20
  /  \
 15   7

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

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

解答

思路

基础题。
开始忘了Queue类。手动写字符串数组“弹出”的功能,很麻烦。查到Queue类就能很好的解决这个问题了。

代码

/**
 * 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;
 *     }
 * }
 */
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
        // 若根节点为空,返回“#,”
        if(root == null)
            return "#,";
        // 新建StringBudffer,存储节点值
        StringBuffer sb = new StringBuffer(root.val+",");
        // 递归左子树
        sb.append(serialize(root.left));
        // 递归右子树
        sb.append(serialize(root.right));
        // 返回StringBuffer的字符串值
        return sb.toString();
    }
    
    /**
     * 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[] ss = data.split(",");
        // 用字符串数组构建字符串队列
        Queue<String> q = new LinkedList<String>();
        for(int i = 0; i < ss.length; i++){
            q.add(ss[i]);
        }
        // 递归生成二叉树
        return preOrder(q);
    }
    
    private TreeNode preOrder(Queue<String> q){
        // “弹出”队列下一个字符串
        String val = q.poll();
        // 如果值为'#'说明是空结点
        if(val.equals("#")) return null;
        // 如果值不为'#',用该值的整型值构建节点
        TreeNode node = new TreeNode(Integer.valueOf(val));
        // 遍历构建节点左子树
        node.left = preOrder(q);
        // 遍历构建节点右子树
        node.right = preOrder(q);
        // 返回节点
        return node;
    }
}
    原文作者:悠扬前奏
    原文地址: https://www.jianshu.com/p/402955bd9bbe
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞