当前位置: 首页 > news >正文

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

目录

  • 二叉树的序列化与反序列化
    • 按层序列化
    • 使用#!和!的原因:

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

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

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

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

在这里插入图片描述

先序序列化二叉树

上面这棵树的先序序列化结果为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

相关文章:

  • 创建漫游用户配置文件
  • 一些模板
  • cnblogs bug(1)
  • poj 2186
  • 好男人找不到女朋友的原因
  • 浅入深出Vue:前言
  • 交换两个变量
  • 使用open flash chart的BarGlass时遇到的问题
  • 09视图
  • 什么是高并发 ,详细讲解
  • Struts Nested标签
  • Codeforces Global Round 1
  • (转)母版页和相对路径
  • 不修改原数组方法
  • [Mvc]在ASP.NET MVC中使用Repeater
  • 08.Android之View事件问题
  • Django 博客开发教程 8 - 博客文章详情页
  • GitUp, 你不可错过的秀外慧中的git工具
  • java8 Stream Pipelines 浅析
  • JavaScript 奇技淫巧
  • mysql 数据库四种事务隔离级别
  • npx命令介绍
  • React Native移动开发实战-3-实现页面间的数据传递
  • SAP云平台运行环境Cloud Foundry和Neo的区别
  • spring cloud gateway 源码解析(4)跨域问题处理
  • tweak 支持第三方库
  • Vue ES6 Jade Scss Webpack Gulp
  • 阿里云前端周刊 - 第 26 期
  • 产品三维模型在线预览
  • 从零开始的无人驾驶 1
  • 构建二叉树进行数值数组的去重及优化
  • 让你成为前端,后端或全栈开发程序员的进阶指南,一门学到老的技术
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 一天一个设计模式之JS实现——适配器模式
  • 智能情侣枕Pillow Talk,倾听彼此的心跳
  • # 透过事物看本质的能力怎么培养?
  • (1)STL算法之遍历容器
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (TOJ2804)Even? Odd?
  • (多级缓存)缓存同步
  • (二)fiber的基本认识
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (算法设计与分析)第一章算法概述-习题
  • (完整代码)R语言中利用SVM-RFE机器学习算法筛选关键因子
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转) SpringBoot:使用spring-boot-devtools进行热部署以及不生效的问题解决
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET 4.0中使用内存映射文件实现进程通讯
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .NET/C# 使用反射注册事件
  • .net中应用SQL缓存(实例使用)