LeetCode—297. 二叉树的序列化与反序列化(困难)

297. 二叉树的序列化与反序列化(困难)

题目描述:
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。

请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。

提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的方法解决这个问题。
在这里插入图片描述

考察重点:通过深度优先遍历DFS对二叉树进行序列化,同等的,再使用DFS对其序列进行反序列化。

/*** Definition for a binary tree node.* type TreeNode struct {*     Val int*     Left *TreeNode*     Right *TreeNode* }*/
func Constructor7() Codec {return Codec{str: ""}
}/**
采用DFS深度优先遍历,实现树的序列化,为空则置为"n"
*/
func rSerial(root *TreeNode) string {if root == nil {return "n"}left := "," + rSerial(root.Left)right := "," + rSerial(root.Right)sel := strconv.Itoa(root.Val)return sel + left + right
}// Serializes a tree to a single string.
func (cc *Codec) Serialize(root *TreeNode) string {return rSerial(root)
}/**
通过字符串恢复树,同样采用DFS深度优先遍历,实现树的反序列化
可以采用两种方式,一种是通过返回值给root.Right root.Left赋值,一种是通过指针给root.Right root.Left赋值
*/
func rDeserial(tt []string, a int) (int, *TreeNode) {if tt[a] == "n" {return a, nil}v, _ := strconv.Atoi(tt[a])a, LeftT := rDeserial(tt, a+1)	//深度搜索继续遍历其左右子节点a, RightT := rDeserial(tt, a+1)root := &TreeNode{v, LeftT, RightT}	//给当前结点赋值return a, root
}// Deserializes your encoded data to tree.
func (cc *Codec) Deserialize(data string) *TreeNode {datas := strings.Split(data, ",")if datas[0] == "n" {return nil}_, root := rDeserial(datas, 0)return root
}/**
func rDeserial(datas []string, index int, pre, root *TreeNode) int { //pre负责记录root的父节点,在root对应"n"时,将pre.left或者pre.right置为nilword := datas[index]if word != "n" {Iword, _ := strconv.Atoi(word)newroot := TreeNode{Val: Iword, Left: &TreeNode{}, Right: &TreeNode{}} //创建当前结点,通过赋值给指针指向位置的方式,实现对参数中的root赋值*root = newrootindex = rDeserial(datas, index+1, root, root.Left) //index记录当前遍历的位置index = rDeserial(datas, index, root, root.Right)} else {if pre.Left == root {	//判断root是pre的左子树还是右子树pre.Left = nil} else {pre.Right = nil}index++}return index
}// Deserializes your encoded data to tree.
func (cc *Codec) Deserialize(data string) *TreeNode {root := &TreeNode{}datas := strings.Split(data, ",")if datas[0] == "n" {return nil}rDeserial(datas, 0, root, root)return root
}
*/

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

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

相关文章

一个简单粗暴的前后端分离方案

项目背景 刚刚参加完一个项目,背景:后端是用java,后端服务已经开发的差不多了,现在要通过web的方式对外提供服务,也就是B/S架构。后端专注做业务逻辑,不想在后端做页面渲染的事情,只向前端提供数…

LeetCode—54. 螺旋矩阵

54. 螺旋矩阵 题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 考察重点:使用全局变量way数组,配合变量n记录走的方向;nowX,nowY记录当前位置&am…

iBATIS.NET 学习笔记(八)

在iBATIS.NET 学习笔记(五)中的DataGrid中加入删除功能&#xff0c;删除客户信息。修改Maps/Customers.xml,在statements标记中加入下面代码&#xff1a;<delete id"DeleteCustomer"parameterClass"string">delete from Customers where CustomerID#…

PowerShell实现批量收集SCVMM中虚拟机IP-续

因为本人技术提升了&#xff0c;所以这个脚本又改进了&#xff0c;得益于同事给我悉心教导c#语法&#xff0c;这个脚本更好用了。废话不多说&#xff0c;直接上代码。#powerd by 九叔 #批量从VMM和Hyper-V中获取IP地址&#xff0c;方便比对。更准确。 #转载必须注明出处&#x…

C/S框架-WebService架构用户凭证(令牌)解决方案

C/S框架-WebService架构用户凭证(令牌)解决方案 http://www.csframework.com/archive/5/arc-5-20110520-1504.htm C/S框架高级版引用WebService技术&#xff0c;WebService架构的应用系统不可忽视其安全性&#xff0c;WebServcie页面(*.asmx)提供了一组接口(WebMethod,Web方法)…

LeetCode—299. 猜数字游戏

299. 猜数字游戏 题目描述&#xff1a; 你在和朋友一起玩 猜数字&#xff08;Bulls and Cows&#xff09;游戏&#xff0c;该游戏规则如下&#xff1a; 写出一个秘密数字&#xff0c;并请朋友猜这个数字是多少。朋友每猜测一次&#xff0c;你就会给他一个包含下述信息的提示&…

有关集中用户的问题

集中用户应该有一个“所属管理插件”的字段&#xff0c;记录此用户的出处&#xff0c;比如“内部员工”&#xff0c;即由“内部控制台”插件管理。 那么用户 staff_tommy 的“所属管理插件”的字段值为“InternelWebControlPanel”. 系统内核插件提供一个扩展点为“UserPro…

mobile web retina 下 1px 边框解决方案

http://www.tuicool.com/articles/ZRv6bun 再谈mobile web retina 下 1px 边框解决方案 时间 2015-01-03 12:03:31 Hugo Web前端开发原文 http://www.ghugo.com/css-retina-hairline/主题 WebKit iOS CSS本文实际上想说的是ios8下 1px解决方案。 1px的边框在devicePixelRatio…

LeetCode—55. 跳跃游戏

55. 跳跃游戏 题目描述&#xff1a; 给定一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 考察重点&#xff1a;由前至后遍历数组&#xff0c;maxPos记录我们当…

Rust下载和安装

2019独角兽企业重金招聘Python工程师标准>>> 1、在Linux和Mac上安装Rust&#xff1a; 在Linux和Mac上安装Rust(稳定的二进制)的一个简单的方法&#xff0c;只需要在shell中运行以下命令&#xff1a; $ curl -sSf https://static.rust-lang.org/rustup.sh | sh 一个…

LeetCode—300. 最长递增子序列

300. 最长递增子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组…

Skype for Business Server 2015-08-反向代理-发布-统一沟通

申明&#xff1a;文章中部分内容有涉及官方帮助或者网上资源整合&#xff0c;如有违权&#xff0c;请速与作者联系&#xff0c;谢谢&#xff01;作者&#xff1a;316191099qq.com培训&#xff1a;Skype for Business Server 2015-项目实战-培训-QQ群:65235615。&#xff08;学员…

架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?

操作服务器上的生产环境&#xff0c;一定要慎之又慎&#xff0c;安全第一&#xff0c;优化第二&#xff01; 一些基本原理 说到清理内存&#xff0c;那么不得不提到/proc这一个虚拟文件系统&#xff0c;这里面的数据和文件都是内存中的实时数据&#xff0c;很多参数的获取都可以…

LeetCode—233. 数字 1 的个数(困难)

233. 数字 1 的个数&#xff08;困难&#xff09; 题目描述&#xff1a; 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 考察重点&#xff1a;分别计算个、十、百…千位上1出现的次数&#xff0c;再求和。 func countDigitOne(n int) int…

JavaScript--fullPage.js插件

GitHub:https://github.com/alvarotrigo/fullPage.js FullPage.js是一个基于JQuery的插件,可以很方便的制作出全屏网站; 一 特点: 1.支持鼠标滚动;2.支持键盘控制前进和后退;3.多个回调函数;4.支持手机/平板触摸事件;5.支持CSS3动画;6.支持窗口缩放,缩放时自动调整;7.jQuery兼…

细细讲述Java技术开发的那些不为人知的规则

本文介绍的Java规则的说明分为3个主要级别&#xff0c;中级是平时开发用的比较多的级别&#xff0c;在今后将陆续写出其他的规则。遵守了这些规则可以提高程序的效率、使代码又更好的可读性等。 一、在finally方法里关掉input或者output资源 方法体里面定义了input或者output流…

LeetCode—301. 删除无效的括号(困难)

301. 删除无效的括号&#xff08;困难&#xff09; 题目描述&#xff1a; 给你一个由若干括号和字母组成的字符串 s &#xff0c;删除最小数量的无效括号&#xff0c;使得输入的字符串有效。 返回所有可能的结果。答案可以按 任意顺序 返回。 考察重点&#xff1a;题目要求找…

LeetCode—56. 合并区间

56. 合并区间 题目描述&#xff1a; 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 考察重点&#x…

[转]软件测试的完整分类

[转]软件测试的完整分类 2015-06-09 转自&#xff1a;软件测试的完整分类 转载于:https://www.cnblogs.com/Ming8006/p/4563994.html

LeetCode—304. 二维区域和检索 - 矩阵不可变

304. 二维区域和检索 - 矩阵不可变 题目描述&#xff1a; 给定一个二维矩阵 matrix&#xff0c;以下类型的多个请求&#xff1a; 计算其子矩形范围内元素的总和&#xff0c;该子矩阵的 左上角 为 (row1, col1) &#xff0c;右下角 为 (row2, col2) 。 实现 NumMatrix 类&…