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

二叉树基础之序列化和反序列化二叉树

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6611039.html 

    一:二叉树序列化(持久化)

    二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。

    序列化可以基于 先序、中序、后序、按层 的二叉树遍历方式来进行修改。原理都是一样的(即遍历顺序不同而已,对每个结点的处理都是一样的),序列化的结果是一个字符串,序列化时通过  某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。

    这里以先序遍历的方式进行序列化举例:

    先序序列化二叉树==定义一个stringbuilder保存序列过程中的结果:按照先序遍历方式遍历二叉树,若结点非空则把 "结点值!" append到builder中;若结点空则把  "#!" append到builder中;最后用builder生成字符串就是序列化结果。    

public class TreeToString {
    public String toString(TreeNode root) {
        StringBuilder builder=new StringBuilder();
        pre(root,builder);
        return builder.toString();
    }
    public void pre(TreeNode root,StringBuilder builder){
        if(root==null){
            builder.append("#!");
        }else{
            builder.append(root.val+"!");
        //注意递归边界:如果当前结点不是null则递归左右儿子;如果不判断当前结点是否为空,则在递归到null时出现空指针异常
            pre(root.left,builder);
            pre(root.right,builder);
        }
    }
}

                          

    二:二叉树的反序列化

    二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。

    先序序列化结果重构二叉树==String[] nodes=str.split("!");//由每个结点的结束符号划分序列化结果序列,得到各个结点值;

    然后按照先序遍历的顺序“根左右”的特性,遍历nodes数组建立二叉树:当前遍历元素非 # 则作为一个结点插入树中作为上一结点的左儿子;

                                                                                             当前遍历元素为 # 则表示此子树已结束,遍历下一元素作为上一结点的右儿子;

                                                                                             即:遇数作左;遇#变向                                                     

相关文章:

  • 数组作业
  • Linux进程管理
  • Spring系列之-Aware系列接口
  • 如何正确配置 Ubuntu 14.04 服务器?
  • JDK 6和JDK 7中的substring()方法
  • 使用事件和消息队列实现分布式事务(转+补充)
  • JFinal极速开发框架使用笔记(三) 分析Model和ActiveRecord
  • 3138 栈练习2
  • innerHTML、html('')与empty在IE上不同的区别
  • 配置tomcat监听80端口、配置tomcat虚拟机、tomcat日志
  • 关于Docker的一些常识
  • linux下tar、zip 压缩文件不带文件路径
  • 【Amaple教程】5. 插件
  • 数值的整数次方
  • 编写高质量iOS与OS X代码的52个有效方法(二)
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 2017年终总结、随想
  • JS数组方法汇总
  • oschina
  • Tornado学习笔记(1)
  • 汉诺塔算法
  • 配置 PM2 实现代码自动发布
  • 收藏好这篇,别再只说“数据劫持”了
  • 跳前端坑前,先看看这个!!
  • 一文看透浏览器架构
  • 在weex里面使用chart图表
  • FaaS 的简单实践
  • PostgreSQL 快速给指定表每个字段创建索引 - 1
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​【已解决】npm install​卡主不动的情况
  • #NOIP 2014# day.2 T2 寻找道路
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm教师工作量核算统计系统 毕业设计 162307
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转) Android中ViewStub组件使用
  • (转)memcache、redis缓存
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)程序员技术练级攻略
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET 5.0正式发布,有什么功能特性(翻译)
  • .NET 8.0 发布到 IIS
  • .NET Core 和 .NET Framework 中的 MEF2
  • .Net Core 中间件验签
  • .NET中GET与SET的用法
  • ?.的用法
  • @Data注解的作用
  • @hook扩展分析
  • @Query中countQuery的介绍
  • @四年级家长,这条香港优才计划+华侨生联考捷径,一定要看!