Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LintCode-7二叉树的序列化和反序列化

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

作者头像
悠扬前奏
发布于 2019-05-28 12:32:48
发布于 2019-05-28 12:32:48
62600
代码可运行
举报
运行总次数:0
代码可运行

题目

描述

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

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

样例

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  3
 / \
9  20
  /  \
 15   7

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

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

解答

思路

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

代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * 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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.07.18 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
思路: 二叉树的各种顺序中,随便挑1种,遍历每个节点, 拼装出1个字符串即可实现序列化。要注意的是, 空节点也需要, 可以找一个特殊符号比如#表示。 反序列化则是相反的过程,解析该字符串即可。
菩提树下的杨过
2021/11/04
2430
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
LeetCode 297.序列化二叉树 - JavaScript
题目描述:请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
心谭博客
2020/04/21
4710
​LeetCode刷题实战449:序列化和反序列化二叉搜索树
算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
程序员小猿
2021/11/29
3540
好友抖音面试真题:二叉树的序列化与反序列化(解法二)
之前分享了朋友面试抖音的真题:LeetCode 297. 二叉树的序列化与反序列化,我用的BFS(广度优先遍历)的方法来做的。事实上,朋友在面试的时候也是用BFS来做的。
Happyjava
2020/07/17
3630
好友抖音面试真题:二叉树的序列化与反序列化(解法二)
【剑指Offer】37. 序列化二叉树
NowCoder 题目描述 请实现两个函数,分别用来序列化和反序列化二叉树。 解题思路 手写结构 import java.util.*; import java.lang.*; /* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ p
瑞新
2020/12/07
2790
每天一道剑指offer-序列化二叉树
怎么序列化的,就怎么反序列化。这里 deserialize反序列化时对于序列化到 String[]arr的哪个结点值来了的变量 index有两个坑(都是笔者亲自踩的):
乔戈里
2019/03/04
3130
LC297—二叉树的序列化与反序列化
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
Java架构师必看
2021/04/22
3250
剑指 Offer 37. 序列化二叉树
链接:https://leetcode-cn.com/problems/xu-lie-hua-er-cha-shu-lcof/
秃头哥编程
2021/07/01
2480
剑指 Offer 37. 序列化二叉树
LeetCode:二叉树的序列化与反序列化_297
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
Yuyy
2022/06/28
2590
LeetCode:二叉树的序列化与反序列化_297
LeetCode 二叉树的序列化与反序列化(二叉树)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。
SakuraTears
2022/01/13
2040
好友抖音面试真题:297.二叉树的序列化与反序列化
终于有心思静下心来搞点事情了,第一件事就是先回顾下好友的面试真题:LeetCode第297题——《二叉树的序列化与反序列化》。
Happyjava
2023/09/01
1300
好友抖音面试真题:297.二叉树的序列化与反序列化
[LintCode] Serialize and Deserialize Binary Tree(二叉树的序列化和反序列化)
设计一个算法,并编写代码来序列化和反序列化二叉树。将树写入一个文件被称为“序列化”,读取文件后重建同样的二叉树被称为“反序列化”。
HoneyMoose
2019/01/30
5880
剑指Offer(六十一)-- 序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 !表示一个结点值的结束(value!)。
秦怀杂货店
2022/02/15
2210
剑指Offer(六十一)-- 序列化二叉树
二叉树的题,就那几个框架,枯燥至极🤔
JSON 的运用非常广泛,比如我们经常将变成语言中的结构体序列化成 JSON 字符串,存入缓存或者通过网络发送给远端服务,消费者接受 JSON 字符串然后进行反序列化,就可以得到原始数据了。这就是「序列化」和「反序列化」的目的,以某种固定格式组织字符串,使得数据可以独立于编程语言。
labuladong
2021/09/23
4480
每日三题-翻转二叉树、二叉树的最近公共祖先、二叉树的序列化与反序列化
👨‍💻个人主页: 才疏学浅的木子 🙇‍♂️ 本人也在学习阶段如若发现问题,请告知非常感谢 🙇‍♂️ 📒 本文来自专栏: 算法 🌈 算法类型:Hot100题 🌈 ❤️ 支持我:👍点赞 🌹收藏 🤟关注 每日三题 翻转二叉树 二叉树的最近公共祖先 二叉树的序列化与反序列化 补上11月11日的每日三题 翻转二叉树 解法一 递归 class Solution { public TreeNode invertTree(TreeNode root) { if(root
才疏学浅的木子
2022/11/18
1720
每日三题-翻转二叉树、二叉树的最近公共祖先、二叉树的序列化与反序列化
[剑指offer] 序列化二叉树
原文地址: https://weiweiblog.cn/serialize/
尾尾部落
2018/09/04
6330
一天一大 leet(二叉树的序列化与反序列化)难度:困难 DAY-16
序列化是将一个数据结构或者对象转换为连续的比特位的操作, 进而可以将转换后的数据存储在一个文件或者内存中, 同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
前端小书童
2020/09/24
4270
一天一大 leet(二叉树的序列化与反序列化)难度:困难 DAY-16
LeetCode 297. 二叉树的序列化与反序列化(前序遍历&层序遍历)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
Michael阿明
2020/07/13
5630
LeetCode-面试题37-序列化二叉树
注意:递归序列化出来的序列和队列方式结果不同,递归返回的列表数据更像DFS遍历的结果,虽然两者序列化和反序列化的方式不同,但不影响构建结果。即怎么序列化,就怎么反序列化
benym
2022/07/14
1880
LeetCode 297:二叉树的序列化与反序列化 Serialize and Deserialize Binary Tree
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。
爱写bug
2020/03/12
6680
推荐阅读
相关推荐
算法练习(15)-设计1个二叉树的序列化与反序列化实现?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验