程序如何输入一棵树

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

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

一、背景

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

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

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

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

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

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

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

二、题意

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

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

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

三、标准二叉树

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

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

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

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

大概流程如下:

程序如何输入一棵树

四、非标准二叉树

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

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

答案是否定的。

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

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

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

大概流程如下:

程序如何输入一棵树

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

五、总结

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

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

程序如何输入一棵树

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

程序如何输入一棵树

六、最后

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

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

-EOF-


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

查看所有标签

猜你喜欢:

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

Build Your Own Web Site the Right Way Using HTML & CSS

Build Your Own Web Site the Right Way Using HTML & CSS

Ian Lloyd / SitePoint / 2006-05-02 / USD 29.95

Build Your Own Website The Right Way Using HTML & CSS teaches web development from scratch, without assuming any previous knowledge of HTML, CSS or web development techniques. This book introduces you......一起来看看 《Build Your Own Web Site the Right Way Using HTML & CSS》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

html转js在线工具
html转js在线工具

html转js在线工具