题目要求:

二叉树的数的序列化和反序列话,二叉树实际是存储在内存中的,一旦断电或者是关机,二叉树的数据就会在内存中丢失。所以我们需要将二叉树的数据保存下来,这个过程叫做持久化或者序列化;将二叉树的数据保存到了磁盘之后,还需要将磁盘中的二叉树的数据加载到内存中去,这过程叫做反序列化。

反序列的标准是:如何序列化的,就怎么反序列话。

代码实现:

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)相关推荐

  1. 牛客网(剑指offer) 第二十五题 复杂链表的复制

    //题目描述 //输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head.(注意,输出结果中请不要返回参数中的节点 ...

  2. 第六章第二十五题(将毫秒数转换成小时数、分钟数和秒数)(Convert milliseconds to hours, minutes, and seconds)

    **6.25(将毫秒数转换成小时数.分钟数和秒数)使用下面的方法头,编写一个将毫秒数转换成小时数.分钟数和秒数的方法. public static String convertMillis(long ...

  3. 力扣-297题 二叉树的序列化与反序列化(C++)- dfs

    题目链接:https://leetcode.cn/problems/serialize-and-deserialize-binary-tree/ 题目如下: /*** Definition for a ...

  4. 求二叉树高度_LeetCode刷题——第二十五天(平衡二叉树)

    这段时间跟二叉树杠上了,接下来还有许多二叉树的题目,虽然已经做了不少了,大多题目都涉及到了递归,也挺好,刚好有机会练习一下递归,但是遇到新的题目还是有点力不从心,还需要看参考答案,真希望有一天像汤神一 ...

  5. C++实现二叉树的序列化和反序列化

    1. 题目要求 二叉树的序列化和反序列化 2. 思路 2.1 序列化 首先我们介绍二叉树先序序列化的方式,假设序列化的结果字符串为str,初始时str等于空字符串.先序遍历二叉树,如果遇到空节点,就在 ...

  6. 第五章第二十九题(显示日历)(Display calendars)

    第五章第二十九题(显示日历)(Display calendars) **5.29(显示日历)编写程序,提示用户输入年份和代表该年的第一天是星期几的数字,然后在控制台上显示该年的日历表.例如,如果用户输 ...

  7. 计算机三级网络技术题库第15套,计算机等级考试理论试题第二十五套

    1.十进制数 141 转换成无符号二进制数是______. A.10011101 B.10001011 C.10001100 D.10001101 2.当前计算机感染病毒的可能途径之一是______. ...

  8. 鸟哥的Linux私房菜(基础篇)- 第二十五章、 Linux 备份策略

    第二十五章. Linux备份策略 最近升级日期:2009/09/18 万一不幸你的 Linux 被黑客入侵了.或是你的 Linux 系统由於硬件关系 (不论是天灾还是人祸) 而挂掉了!这个时候,请问如 ...

  9. 力扣第十五题-三数之和

    前言 力扣第十五题 三数之和 如下所示: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复 ...

最新文章

  1. JS如何获取RadiobuttonList的选中值
  2. c# 使用Autodesk design Review API
  3. 解压大于4g的文件_U盘容量还很大,拷贝时提示“文件太大”无法传输!
  4. 《精通正则表达式》笔记 --- 选择引号内的文字
  5. vue 后端数据成功返回 页面不渲染_vue能获取到数据数据却渲染不到页面上,为什么?...
  6. Application page and Site page
  7. SpringBoot系列(5):SpringBoot对JSON数据的处理
  8. css怎么去掉字体样式,css怎么去掉字体粗体样式
  9. 对软件开发人员的几个阶段思考和总结
  10. Android实现ping功能
  11. 单片机怎么通过按键控制计时器的开始和停止_单片机新手入门系列视频集锦
  12. Ubuntu下 UltraEdit 破解/显色
  13. Java实验一:博饼
  14. 2022年(上半年)信息系统项目管理师考试-综合知识真题及解析(一)
  15. 2022-2027年中国玩偶行业市场全景评估及发展战略规划报告
  16. 腾讯金融云mysql,腾讯云金融级云数据库优势与功能介绍
  17. Excel重复行删除
  18. 晶振(crystal)与晶振(oscillator)的区别
  19. 视频怎么剪辑成短视频?如何制作原创视频素材作品
  20. [hitroad杂货铺]KaTeX使用

热门文章

  1. (SVN笔记)https外网IP端口映射内网IP端口访问SVN服务端
  2. pikachu通关笔记
  3. YII assets使用
  4. tp5.1 分组路由和域名路由
  5. 离线OCR中英文图片识别
  6. VMware ESXi 8.0b - 领先的裸机 Hypervisor (Dell HPE Custom Image update)
  7. Geosever部署及使用
  8. PHP josn和数组互相转换 josn转数组 数组转为josn
  9. 也谈Flash mmorpg地图问题
  10. OpenCV—python 颜色直方图与直方图均衡化