第二十五题:二叉树的序列化和反序列化(Java)
题目要求:
二叉树的数的序列化和反序列话,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失。所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化;将二叉树的数据保存到了磁盘之后,还需要将磁盘中的二叉树的数据加载到内存中去,这过程叫做反序列化。
反序列的标准是:如何序列化的,就怎么反序列话。
代码实现:
package com.isea.brush.tree;import java.util.LinkedList;
import java.util.Queue;/*** 二叉树的序列化* 解决思路:节点和节点之间使用_ 来分隔,空节点使用#来表示,为什么需要使用#来分隔?* 假如所有的节点都是相同的值,且不使用分隔符号,结构不同也会序列化为相同的结果*/
public class SerialBinaryTree {private static class Node {private int value;private Node left;private Node right;public Node(int value) {this.value = value;}}/*** 返回以head为根节点的二叉树的先序序列化后的字符串** @param head* @return*/public static String serialByPre(Node head) {if (head == null) {return "#_";}String res = head.value + "_";res += serialByPre(head.left);res += serialByPre(head.right);return res;}/*** 有序列化后的字符串,进行反序列化,重构一棵树,然后该树的头节点** @param serialString* @return*/public static Node deSerialByPre(String serialString) {String[] values = serialString.split("_");Queue<String> queue = new LinkedList<String>();for (String value : values) {queue.offer(value);}return deSerialByPre(queue);}/*** 有二叉树的先序值序列,得到整颗二叉树的头结点** @param queue* @return*/private static Node deSerialByPre(Queue<String> queue) {String value = queue.poll();if ("#".equals(value)) {return null;}Node head = new Node(Integer.valueOf(value));head.left = deSerialByPre(queue);head.right = deSerialByPre(queue);return head;}public static void printTree(Node head) {System.out.println("Binary Tree:");printInOrder(head, 0, "H", 17);System.out.println();}public static void printInOrder(Node head, int height, String to, int len) {if (head == null) {return;}printInOrder(head.right, height + 1, "v", len);String val = to + head.value + to;int lenM = val.length();int lenL = (len - lenM) / 2;int lenR = len - lenM - lenL;val = getSpace(lenL) + val + getSpace(lenR);System.out.println(getSpace(height * len) + val);printInOrder(head.left, height + 1, "^", len);}public static String getSpace(int num) {String space = " ";StringBuffer buf = new StringBuffer("");for (int i = 0; i < num; i++) {buf.append(space);}return buf.toString();}public static void main(String[] args) {Node head = null;head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.right.right = new Node(5);printTree(head);String pre = serialByPre(head);System.out.println("serialize tree by pre-order: " + pre);head = deSerialByPre(pre);System.out.print("reconstruct tree by pre-order, ");printTree(head);}/*** Binary Tree:* v5v * v3v * H1H * ^2^ * ^4^ ** serialize tree by pre-order: 1_2_4_#_#_#_3_#_5_#_#_* reconstruct tree by pre-order, Binary Tree:* v5v * v3v * H1H * ^2^ * ^4^ */
}
第二十五题:二叉树的序列化和反序列化(Java)相关推荐
- 牛客网(剑指offer) 第二十五题 复杂链表的复制
//题目描述 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点 ...
- 第六章第二十五题(将毫秒数转换成小时数、分钟数和秒数)(Convert milliseconds to hours, minutes, and seconds)
**6.25(将毫秒数转换成小时数.分钟数和秒数)使用下面的方法头,编写一个将毫秒数转换成小时数.分钟数和秒数的方法. public static String convertMillis(long ...
- 力扣-297题 二叉树的序列化与反序列化(C++)- dfs
题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ 题目如下: /*** Definition for a ...
- 求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)
这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案,真希望有一天像汤神一 ...
- C++实现二叉树的序列化和反序列化
1. 题目要求 二叉树的序列化和反序列化 2. 思路 2.1 序列化 首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串.先序遍历二叉树,如果遇到空节点,就在 ...
- 第五章第二十九题(显示日历)(Display calendars)
第五章第二十九题(显示日历)(Display calendars) **5.29(显示日历)编写程序,提示用户输入年份和代表该年的第一天是星期几的数字,然后在控制台上显示该年的日历表.例如,如果用户输 ...
- 计算机三级网络技术题库第15套,计算机等级考试理论试题第二十五套
1.十进制数 141 转换成无符号二进制数是______. A.10011101 B.10001011 C.10001100 D.10001101 2.当前计算机感染病毒的可能途径之一是______. ...
- 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略
第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...
- 力扣第十五题-三数之和
前言 力扣第十五题 三数之和 如下所示: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复 ...
最新文章
- JS如何获取RadiobuttonList的选中值
- c# 使用Autodesk design Review API
- 解压大于4g的文件_U盘容量还很大,拷贝时提示“文件太大”无法传输!
- 《精通正则表达式》笔记 --- 选择引号内的文字
- vue 后端数据成功返回 页面不渲染_vue能获取到数据数据却渲染不到页面上,为什么?...
- Application page and Site page
- SpringBoot系列(5):SpringBoot对JSON数据的处理
- css怎么去掉字体样式,css怎么去掉字体粗体样式
- 对软件开发人员的几个阶段思考和总结
- Android实现ping功能
- 单片机怎么通过按键控制计时器的开始和停止_单片机新手入门系列视频集锦
- Ubuntu下 UltraEdit 破解/显色
- Java实验一:博饼
- 2022年(上半年)信息系统项目管理师考试-综合知识真题及解析(一)
- 2022-2027年中国玩偶行业市场全景评估及发展战略规划报告
- 腾讯金融云mysql,腾讯云金融级云数据库优势与功能介绍
- Excel重复行删除
- 晶振(crystal)与晶振(oscillator)的区别
- 视频怎么剪辑成短视频?如何制作原创视频素材作品
- [hitroad杂货铺]KaTeX使用