• [LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)


    描述

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

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

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

    样例

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

      3
     / 
    9  20
      /  
     15   7
    

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

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

    代码

    GitHub 的源代码,请访问下面的链接:

    https://github.com/cwiki-us/java-tutorial/blob/master/src/test/java/com/ossez/lang/tutorial/tests/lintcode/LintCode0007SerializeAndDeserialize.java

    package com.ossez.lang.tutorial.tests.lintcode;
    
    import java.util.ArrayList;
    
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.ossez.lang.tutorial.models.TreeNode;
    
    /**
     * <p>
     * 7
     * <ul>
     * <li>@see <a href=
     * "https://www.cwiki.us/display/ITCLASSIFICATION/Serialize+and+Deserialize+Binary+Tree">https://www.cwiki.us/display/ITCLASSIFICATION/Serialize+and+Deserialize+Binary+Tree</a>
     * <li>@see<a href=
     * "https://www.lintcode.com/problem/serialize-and-deserialize-binary-tree">https://www.lintcode.com/problem/serialize-and-deserialize-binary-tree</a>
     * </ul>
     * </p>
     * 
     * @author YuCheng
     *
     */
    public class LintCode0007SerializeAndDeserialize {
    
      private final static Logger logger = LoggerFactory.getLogger(LintCode0007SerializeAndDeserialize.class);
    
      /**
       * 
       */
      @Test
      public void testMain() {
        logger.debug("BEGIN");
        String data = "{3,9,20,#,#,15,7}";
    
        System.out.println(serialize(deserialize(data)));
    
      }
    
      /**
       * Deserialize from array to tree
       * 
       * @param data
       * @return
       */
      private TreeNode deserialize(String data) {
        // NULL CHECK
        if (data.equals("{}")) {
          return null;
        }
    
        ArrayList<TreeNode> treeList = new ArrayList<TreeNode>();
    
        data = data.replace("{", "");
        data = data.replace("}", "");
        String[] vals = data.split(",");
    
        // INSERT ROOT
        TreeNode root = new TreeNode(Integer.parseInt(vals[0]));
        treeList.add(root);
    
        int index = 0;
        boolean isLeftChild = true;
        for (int i = 1; i < vals.length; i++) {
          if (!vals[i].equals("#")) {
            TreeNode node = new TreeNode(Integer.parseInt(vals[i]));
            if (isLeftChild) {
              treeList.get(index).left = node;
            } else {
              treeList.get(index).right = node;
            }
            treeList.add(node);
          }
    
          // LEVEL
          if (!isLeftChild) {
            index++;
          }
    
          // MOVE TO RIGHT OR NEXT LEVEL
          isLeftChild = !isLeftChild;
        }
    
        return root;
    
      }
    
      /**
       * 
       * @param root
       * @return
       */
      public String serialize(TreeNode root) {
        // write your code here
        if (root == null) {
          return "{}";
        }
    
        ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
        queue.add(root);
    
        for (int i = 0; i < queue.size(); i++) {
          TreeNode node = queue.get(i);
          if (node == null) {
            continue;
          }
          queue.add(node.left);
          queue.add(node.right);
        }
    
        while (queue.get(queue.size() - 1) == null) {
          queue.remove(queue.size() - 1);
        }
    
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        sb.append(queue.get(0).val);
        for (int i = 1; i < queue.size(); i++) {
          if (queue.get(i) == null) {
            sb.append(",#");
          } else {
            sb.append(",");
            sb.append(queue.get(i).val);
          }
        }
        sb.append("}");
        return sb.toString();
      }
    
    }
    

    点评

    本题目主要需要你对二叉树的遍历方法有所了解。

    遍历二叉树主要有 2 类方法,分别为深度优先(DFS)和广度优先(BFS)。

    在深度优先中,你有又可以使用前序,中序和后序搜索方法,你可以使用递归或者非递归算法实现。对于广度优先算法,一般都会采用非递归的实现方法进行实现。

  • 相关阅读:
    windows server2012 r2 上IIS8.5
    windows server2012 r2 上 安装 IIS8.5
    Visual Studio 14 初试,vNext
    ASP.NET MVC+EF5 开发常用代码
    JavaScript中的Array
    java maven安装以及如何安装第三方的jar以及module的配置
    java字符串格式化错误
    Excel数据生成Sql语句
    tornado异步请求非阻塞
    python tornado User-Agent
  • 原文地址:https://www.cnblogs.com/huyuchengus/p/10129353.html
Copyright © 2020-2023  润新知