前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)

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

作者头像
HoneyMoose
发布2019-01-30 10:17:16
5570
发布2019-01-30 10:17:16
举报
文章被收录于专栏:CWIKIUSCWIKIUS

描述

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

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

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

样例

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

代码语言:javascript
复制
  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)。

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/12/17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 描述
  • 样例
  • 代码
  • 点评
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档