二叉树的序列化和反序列化(先序,按层序列化),包含递归图

目录

  • 二叉树的序列化与反序列化

    • 按层序列化
    • 使用#!和!的原因:

二叉树的序列化与反序列化

序列化:将对象的状态信息转换为可以存储或传输的形式的过程

二叉树的序列化:就是将二叉树转换成字符串

二叉树的反序列化:通过字符串还原一棵二叉树,返回树的头节点.

先序序列化二叉树

上面这棵树的先序序列化结果为5!3!2!1!#!#!#!4!#!#!8!7!6!#!#!#!10!9!#!#!11!#!#!

从上图中我们可以看出在节点为空的位置使用"#!"来代替,每个节点后的数值都添加一个"!".

这样做的 目的: 为了使我们可以使用序列化后的字符串,通过反序列化还原原来的树.所以要做一些标志(也可以使用其他的特殊的符号),文章末尾会列举出几个反例,帮助大家理解.

/**
         * 先序序列化
         *
         * @param 二叉树的根
         * @return 序列化后的字符串
         */
        public static String serializePer(Node head) {
                StringBuilder res = new StringBuilder();
                perSerialize(head, res);
                return res.toString();
        }

        public static void perSerialize(Node head, StringBuilder res) {
                if (head == null) {
                        res.append("#!");
                        return;
                }
                res.append(head.value + "!");
                perSerialize(head.left, res);
                perSerialize(head.right, res);
        }

先序反序列化二叉树

        /**
         * 反序列化
         *
         * @param res : 序列化后的字符串
         * @return 反序列化后的树的头节点
         * 5!3!2!1!#!#!#!4!#!#!8!7!6!#!#!#!10!9!#!#!11!#!#!
         */
        public static Node receiverPer(String res) {
                String[] str = res.split("!");
                Queue<String> queue = new LinkedList<>();
                for (int i = 0; i < str.length; i++) {
                        queue.offer(str[i]);
                }
                return reconPreOrder(queue);
        }

        public static Node reconPreOrder(Queue<String> queue) {
                String value = queue.poll();
                if (value.equals("#")) {
                        return null;
                }
                Node head = new Node(Integer.valueOf(value));
                head.left = reconPreOrder(queue);
                head.right = reconPreOrder(queue);
                return head;
        }

按层序列化

结果: 5!3!8!2!4!7!10!1!#!#!#!6!#!9!11!#!#!#!#!#!#!#!#!

按层序列化就是将"#!"和"!"补全后,逐层添加

//按层序列化
        public static String perLevel(Node head) {
                if (head == null) {
                        return "#!";
                }
                String str = head.value + "!";
                Queue<Node> queue = new LinkedList<>();
                queue.offer(head);
                while (!queue.isEmpty()) {
                        head = queue.poll();
                        if (head.left != null) {
                                str += head.left.value + "!";
                                queue.offer(head.left);
                        } else {
                                str += "#!";
                        }
                        if (head.right != null) {
                                str += head.right.value + "!";
                                queue.offer(head.right);
                        } else {
                                str += "#!";
                        }
                }
                return str;
        }

使用#!和!的原因:

使用 #! 填充空:

使用 ! 分开节点数值

原文地址:https://www.cnblogs.com/sparrowzg/p/10337401.html

时间: 2024-10-05 05:32:09

二叉树的序列化和反序列化(先序,按层序列化),包含递归图的相关文章

JS实现Ajax,Josn数据的序列化和反序列化---例: 省市区联动(包含get,post)

服务器端相应JOSN数据   用到序列化和反序列化----命名空间using System.Web.Script.Serialization; public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; //获取请求的参数 string id = context.Request["id"].ToString(); //通过参数查询父级id

Java对象表示方式1:序列化、反序列化和transient关键字的作用

http://www.cnblogs.com/xrq730/p/4821958.html 平时我们在Java内存中的对象,是无 法进行IO操作或者网络通信的,因为在进行IO操作或者网络通信的时候,人家根本不知道内存中的对象是个什么东西,因此必须将对象以某种方式表示出来,即 存储对象中的状态.一个Java对象的表示有各种各样的方式,Java本身也提供给了用户一种表示对象的方式,那就是序列化.换句话说,序列化只是表示对 象的一种方式而已.OK,有了序列化,那么必然有反序列化,我们先看一下序列化.反序

C#序列化与反序列化方式简单总结

相关类: System.SerializableAttribute特性(或称为属性), System.Runtime.Serialization.Iserializable(自定义序列化接口), System.Runtime.Serialization.IserializationSurrogate(自定义序列化代理接口), System.Runtime.Serializatin.SurrogateSelector(自定义序列化代理设置类) 1:官方备注 序列化使用 BinaryFormatte

java 的序列化与反序列化

前言: 一直很不理解java的序列化的概念,为什么java对象的序列化要实现 Serializable的接口?或者要实现Externalizable的接口?而且Externalizable 的父类还是Serializable!并且Serializable接口中没有定义任何变量和方法! 而查找资料,资料中说 java JDK 中 java.io.ObjectOutputStream 与 java.io.ObjectInputStream 是 序列化API 那这里的序列化又是什么意思?查看 java

Java 中序列化与反序列化引发的思考?

java 中序列化指从对象转变为 二进制流的过程中需要进行序列化,而反序列化指二进制流转换为java 对象.那么有的时候java 存储到数据库不需要序列化, 而计算机系统本质存储的就是二进制文件,数据库的本质又是什么呢? 一.从硬件说起 核心五部分:运算器.控制器.存储器.输入设备.输出设备 根据冯诺伊曼计算机原理,计算机除了五部分外,存储用于存放指令与数据,运算器完成算数与逻辑运算,外部人员通过输入/输出设备操作计算机,且计算机内部是使用二进制表示指令与数据. 其中指定由操作码和地址吗构成,操

Java的序列化与反序列化

Java序列化与反序列化是什么?为什么需要序列化与反序列化?如何实现Java序列化与反序列化?本文围绕这些问题进行了探讨. 1.Java序列化与反序列化 Java序列化是指把Java对象转换为字节序列的过程:而Java反序列化是指把字节序列恢复为Java对象的过程. 2.为什么需要序列化与反序列化 我们知道,当两个进程进行远程通信时,可以相互发送各种类型的数据,包括文本.图片.音频.视频等, 而这些数据都会以二进制序列的形式在网络上传送.那么当两个Java进程进行通信时,能否实现进程间的对象传送

ASP.NET 中JSON 的序列化和反序列化

JSON是专门为浏览器中的网页上运行的JavaScript代码而设计的一种数据格式.在网站应用中使用JSON的场景越来越多,本文介绍ASP.NET中JSON的序列化和反序列化,主要对JSON的简单介绍,ASP.NET如何序列化和反序列化的处理,在序列化和反序列化对日期时间.集合.字典的处理. 一.JSON简介: JSON(JavaScript Object Notation,JavaScript对象表示法)是一种轻量级的数据交换格式. JSON是"名值对"的集合.结构由大括号''{}'

014.序列化与反序列化

1.序列化序列化:串行化 对象持久化 将对象存储到文件或数据库的字段中反序列化:将文件恢复成对象作用:1.永久保存数据2.传递数据 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 实现序列化反序列化需要引用命名空间: Using system.runtime.seralization.formatters.binary; Runtime 运行时 serialization 序列化 Formatters 格式化程序,格式器 Bin

018.序列化与反序列化的使用案例

序列化反序列化: 序列化:串行化 对象持久化 将对象存储到文件或数据库的字段中 反序列化:将文件恢复成对象 作用: 1.永久保存数据 2.传递数据 要序列化的对象对应的类以及类的属性.子类必须是可序列化的 实现序列化反序列化需要引用命名空间: Using system.runtime.seralization.formatters.binary; Runtime 运行时 serialization 序列化 Formatters 格式化程序,格式器 Binary 二进制的 使用实例:题==>创建一