【剑指Offer】62、序列化二叉树
题目描述
请实现两个函数,分别用来序列化和反序列化二叉树
二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。
二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。
题解:递归
public static String Serialize(TreeNode root) {
//先序遍历
if (root == null) {
return "#_";
}
String res = root.val + "_";
res+=Serialize(root.left);
res += Serialize(root.right);
return res;
}
/**
* 将序列化字符串装入一个queue中
*/
public static TreeNode Deserialize(String str) {
Queue<String> queue = new LinkedList<>();
Collections.addAll(queue, str.split("_"));
return Deserialize(queue);
}
/**
* 前序遍历反序列化
* 从队列中取出一个判断是否是"#",如果是表示该结点为null,否则新建结点
*/
public static TreeNode Deserialize(Queue<String> queue) {
String string = queue.poll();
if (string.equals("#")) {
return null;
}
TreeNode root = new TreeNode(Integer.parseInt(string));
root.left = Deserialize(queue);
root.right = Deserialize(queue);
return root;
}
初始化树:
public static class TreeNode{
int val=0;
TreeNode left=null;
TreeNode right=null;
public TreeNode(int val){
this.val=val;
}
}
private static List<TreeNode> nodeList = null;
public static TreeNode createBinTree(int[] array) {
nodeList = new LinkedList<TreeNode>();
// 将一个数组的值依次转换为TreeNode节点
for (int nodeIndex = 0; nodeIndex < array.length; nodeIndex++) {
nodeList.add(new TreeNode(array[nodeIndex]));
}
// 对前lastParentIndex-1个父节点按照父节点与孩子节点的数字关系建立二叉树
for (int parentIndex = 0; parentIndex < array.length / 2 - 1; parentIndex++) {
// 左孩子
nodeList.get(parentIndex).left = nodeList
.get(parentIndex * 2 + 1);
// 右孩子
nodeList.get(parentIndex).right = nodeList
.get(parentIndex * 2 + 2);
}
// 最后一个父节点:因为最后一个父节点可能没有右孩子,所以单独拿出来处理
int lastParentIndex = array.length / 2 - 1;
// 左孩子
nodeList.get(lastParentIndex).left = nodeList
.get(lastParentIndex * 2 + 1);
// 右孩子,如果数组的长度为奇数才建立右孩子
if (array.length % 2 == 1) {
nodeList.get(lastParentIndex).right = nodeList
.get(lastParentIndex * 2 + 2);
}
return nodeList.get(0);
}
层序遍历打印:
public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> res = new ArrayList<>();
LinkedList<TreeNode> queue = new LinkedList<>();
if(pRoot==null){
return res;
}
queue.offer(pRoot);
while (queue.size()!=0){
int size=queue.size();
ArrayList<Integer> list = new ArrayList<>();
for(int i=0;i<size;i++) {
TreeNode node = queue.poll();
if(node==null){
continue;
}
list.add(node.val);
queue.offer(node.left);
queue.offer(node.right);
}
if(list.size()!=0){
res.add(list);
}
}
return res;
}
测试:
public static void main(String[] args) {
int[] tree={8,6,10,5,7,9,11};
TreeNode root = createBinTree(tree);
String serialize = Serialize(root);
System.out.println(serialize);
TreeNode deserialize = Deserialize(serialize);
ArrayList<ArrayList<Integer>> lists = Print(deserialize);
for (ArrayList<Integer> list : lists) {
System.out.println(list);
}
}
输出:
8_6_5_#_#_7_#_#_10_9_#_#_11_#_#_
[8]
[6, 10]
[5, 7, 9, 11]
【剑指Offer】62、序列化二叉树的更多相关文章
- 剑指 Offer 37. 序列化二叉树 + 二叉树的层次遍历
剑指 Offer 37. 序列化二叉树 Offer_37 题目描述 题目解析 本题主要考察的就是二叉树的层次遍历. 层次遍历时可以根据二叉树的特点将空结点也进栈. 反序列化时同样可以根据层次遍历的思路 ...
- 力扣 - 剑指 Offer 37. 序列化二叉树
目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...
- 【剑指Offer】序列化二叉树 解题报告(Python)
[剑指Offer]序列化二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews 题目 ...
- 【Java】 剑指offer(37) 序列化二叉树
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 请实现两个函数,分别用来序列化和反序列化二叉树. 思路 一般情况下 ...
- Go语言实现:【剑指offer】序列化二叉树
该题目来源于牛客网<剑指offer>专题. 请实现两个函数,分别用来序列化和反序列化二叉树. 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建 ...
- 剑指offer:序列化二叉树
题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树 思路分析: 这里一开始有点不明白题目的意思.实际上序列化应该指把二叉树用某种编码方式表示,这里一般是字符串的形式.而反序列就是将之前生成的序 ...
- 剑指Offer 61. 序列化二叉树 (二叉树)
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 题目地址 https://www.nowcoder.com/practice/cf7e25aa97c04cc1a68c8f040e71fb84 ...
- 每日一题 - 剑指 Offer 37. 序列化二叉树
题目信息 时间: 2019-06-29 题目链接:Leetcode tag:序列化 二叉树 队列 难易程度:中等 题目描述: 请实现两个函数,分别用来序列化和反序列化二叉树. 示例: 1 / \ 2 ...
- 剑指offer——31序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存.序列化可以基于先 ...
- [剑指Offer] 61.序列化二叉树
题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r ...
随机推荐
- ASP.NET Core on K8S 入门学习系列文章目录
一.关于这个系列 自从2018年底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发现运维工 ...
- BZOJ 1614 [Usaco2007 Jan]Telephone Lines架设电话线 (二分+最短路)
题意: 给一个2e4带正边权的图,可以免费k个边,一条路径的花费为路径上边权最大值,问你1到n的最小花费 思路: 对于一个x,我们如果将大于等于x的边权全部免费,那么至少需要免费的边的数量就是 “设大 ...
- Jmeter——使用JSR223元件实现RSA登录加密
一.RSA加密简介 RSA加密是一种非对称加密.可以在不直接传递密钥的情况下,完成解密.这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险.是由一对密钥来进行加解密的过程,分别称为公钥和私 ...
- 《Redis5.x入门教程》之准备工作、数据类型
关注公众号:CoderBuff,回复"redis"获取<Redis5.x入门教程>完整版PDF. 第一章 · 准备工作 Redis安装 Redis5.0.7下载地址:h ...
- go微服务框架kratos学习笔记八 (kratos的依赖注入)
目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...
- spring cloud微服务快速教程之(七) Spring Cloud Alibaba--nacos(一)、服务注册发现
0.前言 什么是Spring Cloud Alibaba? Spring Cloud Alibaba 是阿里开源的,致力于提供微服务开发的一站式解决方案.此项目包含开发分布式应用微服务的必需组件,方便 ...
- 怎么理解Laravel的核心架构
使用过larave框架的朋友都知道laravel框架里面除了提供一些基本的功能(如控制器.视图.模型)之外,还有中间件.门面.契约等,这些东西是如何在laravel框架运用起来的呢?今天就和大家详聊一 ...
- html input元素的所有type属性
<input /> 属性 type="text" 输入框的类型为文本 type="password" 输入框的类型为密码 type="ra ...
- KNN和K-Means算法
一.KNN算法 1.KNN算法介绍 https://wizardforcel.gitbooks.io/dm-algo-top10/content/knn.html 2.KNN算法例子 import n ...
- windows服务器 IIS FTP服务
一.安装ftp,如果服务器没有,去windows组件里面装一下. 安装IIS,安装FTP(版本不同,选项不相同,这两项必选) 二.装完之后在IIS管理中心创建FTP站点 创建类型 ftp站点: ...