开发工具分享
  • 首页
  • 计算科学
  • 文化旅游
  • 项目和网站
    • OSSEZ 计算技术
    • USRealEstate 社区
    • 地区文化
    • CWIKI.US
    • BUG.OSSEZ.COM
    • RSS.OSSEZ.COM
CWIKIUS.CN
一个有独立思考和温度的清新站
  1. Home
  2. Computer Science
  3. This article

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

2018年12月16日 1171Browse 0Like 0Comments

描述

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

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

对二进制树进行反序列化或序列化的方式没有限制,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)。

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

Tags: LintCode 算法
Last updated:2024年08月29日

HoneyMoose

有温度的人文和独立的思考

Like
< Previous
Next >

Comments

Cancel reply

Archives
  • June 2026
  • May 2026
  • April 2026
  • March 2026
  • February 2026
  • January 2026
  • December 2025
  • November 2025
  • October 2025
  • September 2025
  • August 2025
  • July 2025
  • June 2025
  • May 2025
  • April 2025
  • March 2025
  • February 2025
  • January 2025
  • December 2024
  • November 2024
  • October 2024
  • September 2024
  • August 2024
  • July 2024
  • June 2024
  • May 2024
  • April 2024
  • March 2024
  • February 2024
  • January 2024
  • December 2023
  • November 2023
  • October 2023
  • September 2023
  • August 2023
  • July 2023
  • June 2023
  • May 2023
  • April 2023
  • December 2022
  • November 2022
  • October 2022
  • September 2022
  • August 2022
  • May 2022
  • April 2022
  • March 2022
  • February 2022
  • January 2022
  • December 2021
  • November 2021
  • October 2021
  • September 2021
  • August 2021
  • July 2021
  • June 2021
  • May 2021
  • April 2021
  • March 2021
  • February 2021
  • January 2021
  • December 2020
  • November 2020
  • October 2020
  • September 2020
  • August 2020
  • July 2020
  • June 2020
  • May 2020
  • April 2020
  • March 2020
  • February 2020
  • January 2020
  • December 2019
  • November 2019
  • October 2019
  • September 2019
  • August 2019
  • July 2019
  • June 2019
  • May 2019
  • April 2019
  • March 2019
  • February 2019
  • January 2019
  • December 2018
  • November 2018
  • October 2018
  • September 2018
  • August 2018
  • July 2018
  • June 2018
  • May 2018
  • April 2018
  • March 2018
Categories
  • Computer Science (2,367)
    • Confluence (663)
    • Gradle (12)
  • U.S. (514)
  • 文化旅游 (146)

COPYRIGHT © 2020 CWIKIUS. ALL RIGHTS RESERVED.

THEME KRATOS MADE BY VTROIS

湘ICP备2020018253号-1