程序如何输入一棵树

栏目: 数据库 · 发布时间: 5年前

内容简介:平常在 leetcode 上做树的题时,有没有发现树的输入是一个字符串?对于 Leetcode 来说,这样做的好处是输入样例和输出样例里面,可以使用字符串来表示一棵树。但是对于在本地编写代码,本地测试代码的我们来说,这个就会遇到一个问题:需要将这个字符串转化为树。

一、背景

平常在 leetcode 上做树的题时,有没有发现树的输入是一个字符串?

对于 Leetcode 来说,这样做的好处是输入样例和输出样例里面,可以使用字符串来表示一棵树。

但是对于在本地编写代码,本地测试代码的我们来说,这个就会遇到一个问题:需要将这个字符串转化为树。

实际上在很早之前,我曾在《 Leetcode 第127场比赛回顾 》里面提到,我的 Leetcode 模板里支持了树,原话如下:

之前提到过,我自己精心打造了一个 LeetCode 专用的模板。
这次做了树相关的题后,发现我的模板中树的封装比较少,这次增加了一些树的基础功能,可以大大的加快测试。
想要我的这个模板的朋友,可以在公众号后台回复leetcode免费获取源代码。

这次主要新增了这样几个功能:
1.LeetCode 数组形式的输出样例转化为树
2.友好的打印树
3.自动对比树的答案是否正确

今天我们就来看看这个功能是如何实现的吧。

二、题意

设计一个算法来实现二叉树的序列化与反序列化。

序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境。

采取相反方式则可以得到原数据。

三、标准二叉树

假设这棵树是标准的二叉树,那直接按照先序遍历就可以生成一个序列,这个序列可以逆向生成原始的二叉树。

大概方法是维护一个队列,代表当前构造出来树的叶子节点。

每次从队列里得到待处理的节点 A ,序列里面接下来的两个值就是节点A的两个儿子。

然后两个儿子进入队列,节点 A 出队列,这样队列就保持了所描述的包含所有叶子节点的性质。

大概流程如下:

程序如何输入一棵树

四、非标准二叉树

对于非标准二叉树,有些节点可能只有一个儿子或者没有儿子,此时可以使用 null 来代替。

那我们有没有必要使用 null 填充一个满的二叉树呢?

答案是否定的。

分析一下上面标准二叉树的过程,队列里的节点与序列里的两个值一一对应起来。

如果我们遇到某个节点的儿子为空填充为 null 时,只需要进行特殊处理,不进入队列。

那么,队列里的叶子与序列里的值将依旧是一一对应的,从而保证可以还原会原始的二叉树。

大概流程如下:

程序如何输入一棵树

按照这样的理论,我们就可以实现对应的序列转二叉树了。

五、总结

总结一下就是:当一个节点某个儿子为空时,用 null 代替。

这样使用先序遍历生成的序列就可以唯一的表示一个二叉树了,从而能够还原二叉树。

程序如何输入一棵树

而对于二叉树生成序列,而按照定义BFS生成即可。

程序如何输入一棵树

六、最后

二叉树序列化的方法其实很多,这篇文章分享的只是 LeetCode 上使用的一种方法。

常见的序列化方法还有哪些呢?可以留言一起探讨一下。

-EOF-


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Intel汇编语言程序设计

Intel汇编语言程序设计

Kip Irvine / 电子工业出版社 / 2007-9-1 / 61.00元

《国外计算机科学教材系列•Intel汇编语言程序设计(第5版)》全面细致地讲述了汇编语言程序设计的各个方面。从微处理器体系结构、工作机制到指令集;从最基本的编译器链器的使用到高级过程、结构和宏的使用;从用纯汇编编写程序到用C/C++等最新编译器与汇编的混合接口编程;从16位实模式下BIOS、DOS实模式文本及图形程序设计到32位保护模式的Windows程序设计;从磁盘基础知识到Intel指令编码、......一起来看看 《Intel汇编语言程序设计》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具