力扣labuladong——一刷day34

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣297. 二叉树的序列化与反序列化
  • 二、力扣二叉树后序序列化
  • 三、力扣二叉树层序序列化与反序列化


要说序列化和反序列化,得先从 JSON 数据格式说起。 JSON 的运用非常广泛,比如我们经常将变成语言中的结构体序列化成JSON 字符串,存入缓存或者通过网络发送给远端服务,消费者接受JSON 字符串然后进行反序列化,就可以得到原始数据了。 这就是序列化和反序列化的目的,以某种特定格式组织数据,使得数据可以独立于编程语言。 那么假设现在有一棵用 Java 实现的二叉树,我想把它通过某些方式存储下来,然后用 C++ 读取这棵并还原这棵二叉树的结构,怎么办?这就需要对二叉树进行序列化和反序列化了。

前言


一、力扣297. 二叉树的序列化与反序列化

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {String SEP = ",";String NULL = "#";// Encodes a tree to a single string.public String serialize(TreeNode root) {StringBuilder sb = new StringBuilder();serialize(root,sb);return sb.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {LinkedList<String> list = new LinkedList<>();for(String s : data.split(SEP)){list.add(s);}return fun(list); }public TreeNode fun(LinkedList<String> list){if(list.isEmpty()){return null;}String first = list.removeFirst();if(first.equals(NULL)){return null;}TreeNode cur = new TreeNode(Integer.parseInt(first));cur.left = fun(list);cur.right = fun(list);return cur;}public void serialize(TreeNode root, StringBuilder sb){if(root == null){sb.append(NULL).append(SEP);return;}sb.append(root.val).append(SEP);serialize(root.left,sb);serialize(root.right,sb);}
}// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

二、力扣二叉树后序序列化

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {if(root == null){return "#";}String l = serialize(root.left);String r = serialize(root.right);return l + "," + r + "," + root.val;}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {LinkedList<String> list = new LinkedList<>();for(String s : data.split(",")){list.add(s);}return fun(list);}public TreeNode fun(LinkedList<String> list){String last = list.removeLast();if(last.equals("#")){return null;}TreeNode cur = new TreeNode(Integer.parseInt(last));cur.right = fun(list);cur.left = fun(list);return cur;}
}// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

三、力扣二叉树层序序列化与反序列化

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
public class Codec {// Encodes a tree to a single string.public String serialize(TreeNode root) {if(root == null){return "";}StringBuilder sb = new StringBuilder();Deque<TreeNode> deq = new LinkedList<>();deq.offerLast(root);while(!deq.isEmpty()){int len = deq.size();for(int i = 0; i < len; i ++){TreeNode cur = deq.pollFirst();if(cur == null){sb.append("#").append(",");continue;}sb.append(cur.val).append(",");deq.offerLast(cur.left);deq.offerLast(cur.right);}}return sb.toString();}// Decodes your encoded data to tree.public TreeNode deserialize(String data) {if(data.isEmpty()){return null;}String[] da = data.split(",");TreeNode root = new TreeNode(Integer.parseInt(da[0]));Deque<TreeNode> deq = new ArrayDeque<>();int index = 0;deq.offerLast(root);while(!deq.isEmpty()){int len = deq.size();for(int i = 0; i < len; i ++){TreeNode cur = deq.pollFirst();index ++;if(!da[index].equals("#")){cur.left = new TreeNode(Integer.parseInt(da[index]));deq.offerLast(cur.left);}index ++;if(!da[index].equals("#")){cur.right = new TreeNode(Integer.parseInt(da[index]));deq.offerLast(cur.right);}}}return root;}
}// Your Codec object will be instantiated and called as such:
// Codec ser = new Codec();
// Codec deser = new Codec();
// TreeNode ans = deser.deserialize(ser.serialize(root));

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【go】报错整理与解决

文章目录 依赖下载失败checksum mismatch启动报错missing go.sum 依赖下载失败checksum mismatch > go get github.com/hibiken/asynqmon go: downloading github.com/hibiken/asynqmon v0.7.2 go: github.com/hibiken/asynqmonv0.7.2: verifying module: checksum mismatc…

HTML5学习系列之网页图像

HTML5学习系列之网页图像 前言定义图像定义流定义图标 总结 前言 学习记录 定义图像 标签可以直接把图像插入网页中。 <img src"xx" alt"xx"/>src&#xff1a;显示图像的URLalt&#xff1a;设置图像的替代文本height、width&#xff1a;图像的高度…

QUIC协议详解

前言协议特点QUIC协议与HTTP/2协议区别QUIC协议的多路复用技术优势QUIC协议在Java中的应用存在的问题 前言 QUIC&#xff08;Quick UDP Internet Connections&#xff09;是一种基于 UDP 的传输层协议&#xff0c;由 Google 提出。从协议栈可以看出&#xff0c;QUIC HTTP/2 …

计算机毕业设计选题推荐-一周穿搭推荐微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

自定义Graph Component:1.2-其它Tokenizer具体实现

本文主要介绍了Rasa中相关Tokenizer的具体实现&#xff0c;包括默认Tokenizer和第三方Tokenizer。前者包括JiebaTokenizer、MitieTokenizer、SpacyTokenizer和WhitespaceTokenizer&#xff0c;后者包括BertTokenizer和AnotherWhitespaceTokenizer。 一.JiebaTokenizer   Ji…

智慧环保:科技驱动下的环境保护新篇章

智慧环保&#xff1a;科技驱动下的环境保护新篇章 环境保护已经成为当今社会的重要议题&#xff0c;而科技的飞速发展为我们开启了智慧环保的新篇章。在这篇文章中&#xff0c;我们将介绍智慧环保所带来的机会和创新&#xff0c;以及科技在环境保护中的重要作用。 智慧环保的理…

香港科技大学广州|智能制造学域机器人与自主系统学域博士招生宣讲会—中国科学技术大学专场

&#x1f3e0;地点&#xff1a;中国科学技术大学西区学生活动中心&#xff08;一楼&#xff09;报告厅 【宣讲会专场1】让制造更高效、更智能、更可持续—智能制造学域 &#x1f559;时间&#xff1a;2023年11月16日&#xff08;星期四&#xff09;18:00 报名链接&#xff1a…

利用回溯绕过正则表达式

目录 利用strpos的特性拿到flag 利用回溯绕过正则表达式 利用回溯次数绕过正则表达式并且实现文件上传 使用回溯绕过正则表达式waf拿到flag 本篇会讲解三个实验来分别绕过正则表达式&#xff0c;python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂…

stylelint报错at-rule-no-unknown

stylelint报错at-rule-no-unknown stylelint还将各种 sass -rules 标记mixin为include显示未知错误 at-rule-no-unknown ✖ stylelint --fix:Deprecation warnings: 78:1 ✖ Unexpected unknown at-rule "mixin" at-rule-no-unknown 112:3 ✖ Unexpected un…

设计模式-适配器-笔记

适配器模式Adapter 动机&#xff08;Motivation&#xff09; 在软件系统中&#xff0c;由于应用环境的变化&#xff0c;常常需要将“一些现存的对象”放在新的环境中应用&#xff0c;但是新环境要求的接口是在这些现存对象所不满足的。 如何应对这种“迁移的变化”&#xff1…

C语言求解汉诺塔问题

C语言解决汉诺塔问题&#xff1a; #include <stdio.h>void move(int n, char a, char b, char c) {if(n 1){printf("%c --> %c\n", a, c);return;}move(n - 1, a, c, b);printf("%c --> %c\n", a, c);move(n - 1, b, a, c); }int main() {in…

力扣第695题 岛屿的最大面积 C++ DFS BFS 附Java代码

题目 695. 岛屿的最大面积 中等 相关标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个大小为 m x n 的二进制矩阵 grid 。 岛屿 是由一些相邻的 1 (代表土地) 构成的组合&#xff0c;这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你…

如何安装clang-9,clang,clang++

# 制定要version9的clang sudo apt-get install clang-9 # 创建软链 sudo ln -s /usr/bin/clang-9 /usr/bin/clang sudo ln -s /usr/bin/clang-9 /usr/bin/clang如果你已经安装了 clang-9&#xff0c;那么 clang 已经包含在内。通常&#xff0c;clang 是 clang 的一个符号链接&…

【Liunx】部署WEB服务:Apache

【Liunx】部署WEB服务:Apache 概述Apache1.介绍2.Apache文件路径3.Apache详解(1)安装Apache(2)启动Apache(3)配置文件a.Apache主配置文件&#xff1a;vim /etc/httpd/conf/httpd.conf信息&#xff1a;b.基于主机头的虚拟主机 (4)开始演示&#xff1a;a.新建两个网站根目录b.分别…

RPC实现简单解析

RPC是什么&#xff0c;先摘取一段解释&#xff1a; RPC全称为远程过程调用&#xff08;Remote Procedure Call&#xff09;&#xff0c;它是一种计算机通信协议&#xff0c;允许一个计算机程序调用另一个计算机上的子程序&#xff0c;而无需了解底层网络细节。通过RPC&#xff…

C++ 循环截取字符串

示例 1&#xff1a; 输入&#xff1a;s "abcdefghi", k 3, fill "x" 输出&#xff1a;["abc","def","ghi"] 解释&#xff1a; 前 3 个字符是 "abc" &#xff0c;形成第一组。 接下来 3 个字符是 "def&qu…

DVWA - 4

文章目录 JavaScriptlowmedium JavaScript 前端攻击。token 不能由前端生成&#xff0c;js 很容易被攻击者获取&#xff0c;从而伪造 token。同样其他重要的参数也不能由前端生成。 low 不修改输入&#xff0c;点击提交报错: 根据提示改成 success&#xff0c;还是报错&…

特殊空格处理

背景 通过http传输json时&#xff0c;出现以下异常 com.fasterxml.jackson.core.JsonParseException: Illegal unquoted character ((CTRL-CHAR, code 0)): has to be escaped using backslash to be included in string value at [Source: (PushbackInputStream); line: 1, …

3.6 Windows驱动开发:内核进程汇编与反汇编

在笔者上一篇文章《内核MDL读写进程内存》简单介绍了如何通过MDL映射的方式实现进程读写操作&#xff0c;本章将通过如上案例实现远程进程反汇编功能&#xff0c;此类功能也是ARK工具中最常见的功能之一&#xff0c;通常此类功能的实现分为两部分&#xff0c;内核部分只负责读写…

WPF异步编程

在WPF应用程序中进行异步编程是非常重要的&#xff0c;因为这有助于保持用户界面的响应性&#xff0c;特别是当执行长时间运行的操作时&#xff0c;例如访问网络资源、进行大量的数据处理或调用耗时的I/O操作。 WPF的异步编程通常围绕以下几个关键概念&#xff1a; Dispatcher…