程序如何输入一棵树
作者:
| 更新日期:做树相关的题时,有没有想过如何输入一棵树呢?
本文首发于公众号:天空的代码世界,微信号:tiankonguse
一、背景
平常在 leetcode 上做树的题时,有没有发现树的输入是一个字符串?
对于 Leetcode 来说,这样做的好处是输入样例和输出样例里面,可以使用字符串来表示一棵树。
但是对于在本地编写代码,本地测试代码的我们来说,这个就会遇到一个问题:需要将这个字符串转化为树。
实际上在很早之前,我曾在《Leetcode 第127场比赛回顾》里面提到,我的 Leetcode 模板里支持了树,原话如下:
之前提到过,我自己精心打造了一个 LeetCode 专用的模板。
这次做了树相关的题后,发现我的模板中树的封装比较少,这次增加了一些树的基础功能,可以大大的加快测试。
想要我的这个模板的朋友,可以在公众号后台回复leetcode免费获取源代码。
这次主要新增了这样几个功能:
1.LeetCode 数组形式的输出样例转化为树
2.友好的打印树
3.自动对比树的答案是否正确
今天我们就来看看这个功能是如何实现的吧。
二、题意
设计一个算法来实现二叉树的序列化与反序列化。
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境。
采取相反方式则可以得到原数据。
三、标准二叉树
假设这棵树是标准的二叉树,那直接按照先序遍历就可以生成一个序列,这个序列可以逆向生成原始的二叉树。
大概方法是维护一个队列,代表当前构造出来树的叶子节点。
每次从队列里得到待处理的节点A
,序列里面接下来的两个值就是节点A的两个儿子。
然后两个儿子进入队列,节点A
出队列,这样队列就保持了所描述的包含所有叶子节点的性质。
大概流程如下:
四、非标准二叉树
对于非标准二叉树,有些节点可能只有一个儿子或者没有儿子,此时可以使用 null
来代替。
那我们有没有必要使用 null
填充一个满的二叉树呢?
答案是否定的。
分析一下上面标准二叉树的过程,队列里的节点与序列里的两个值一一对应起来。
如果我们遇到某个节点的儿子为空填充为null
时,只需要进行特殊处理,不进入队列。
那么,队列里的叶子与序列里的值将依旧是一一对应的,从而保证可以还原会原始的二叉树。
大概流程如下:
按照这样的理论,我们就可以实现对应的序列转二叉树了。
五、总结
总结一下就是:当一个节点某个儿子为空时,用null
代替。
这样使用先序遍历生成的序列就可以唯一的表示一个二叉树了,从而能够还原二叉树。
而对于二叉树生成序列,而按照定义BFS生成即可。
六、最后
二叉树序列化的方法其实很多,这篇文章分享的只是 LeetCode 上使用的一种方法。
常见的序列化方法还有哪些呢?可以留言一起探讨一下。
-EOF-
本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。