树的遍历python_Python for USACO——树的遍历

上一章的内容,我们介绍了树形结构的概念,以及如何通过Python 来表示一棵树。本篇文章我们就要来考虑下如何进行树的遍历。

在讲数据结构的时候,我们做过一个高度概括,所谓的数据结构就是保存数据的一种方式,而对数据的操作也就是 增、删、查、改 这么几种典型的操作。 上一篇文章在介绍树的基本概念时,已经介绍了节点的增加,今天要重点介绍的就是遍历查找,所谓遍历查找,就是访问树结构中的所有节点。

在线性结构中,对数据的遍历方式是很简单的,线性结构是有顺序的,只需要按照顺序依次访问各个节点即可。 但树结构不是线性的,它有很多分支,所以它的遍历操作相比而言要复杂不少。

上一章的二叉树Python实现中,我们看到任何一个节点,都是由节点本身的信息,左子树,右子树 三个部分组成的,那么访问节点信息的顺序也可以有三种:

1. 前序遍历:先访问当前节点的信息,然后再访问左子树,最后访问右子树

2. 中序遍历:先递归的访问左子树,再访问当前节点,最后访问右子树

3. 后序遍历:先递归的访问左子树,再访问右子树,最后访问当前节点

上面就是三种二叉树遍历的概念定义,定义非常简单,但仅仅只是看定义,相信很难彻底理解,接下来通过一张图具体看一下,这里给出的是前序遍历的过程:

图中是一个二叉树描述的书本章节结构,如果采用前序遍历方式,那么会先访问当前的节点,其次访问左子树,然后是右子树,我们一步步分解一下:

1. 首先访问根节点 “Book”

2. 然后访问 “Book” 节点的左子树,于是访问到了“Chapter1" 节点

3. 继续访问 “Chapter1” 节点的左子树,于是访问到了 “Section1.1” 节点

4. “Section1.1” 没有任何子树,所以就会跳转到 “Chapter1“ 的右子树“Section1.2”

5. 访问了“Section1.2” 之后,继续访问它的左子树“Ssection1.2.1”,由于这个节点也没有子节点,接下来会访问“Section1.2.2”

6. 以此类推,最后会访问最右边的节点“Section2.2.2”

大家仔细看一下上面的访问步骤,就能切实的理解前序遍历的流程。图中最上面也给出了节点访问的顺序。

同样是上面这张图,如果是按照中序遍历,访问的流程会有什么变化呢?

1. 中序遍历会首先访问左子树,“Book”节点有左子树,所以会访问它的左子树

2. “Book” 的左子树是一个以“Chapter1” 为根的树,根据中序的规则,继续寻找它的左子树,找到了一个以“Section1.1”为根的树

3. “Section1.1” 没有左子树了,于是直接会访问 ”Section1.1“节点,它也没有右子树,所以退回到上一层”Chapter1“节点,此时“Chapter1”节点的左子树都已经访问完毕了,可以访问当前“Chapter1”节点了。

4. 访问完”Chapter1“节点后,会访问它的右子树”Section 1.2“节点

5. 但这里注意,由于“Section1.2”有左子树,所以会先访问它的左子树“Section1.2.1”节点,然后才会访问“Section1.2”节点

6. 按此顺序,整张图的访问顺序是:S1.1->Ch1->S1.2.1->S1.2->S1.2.2->Book->S2.1->Ch2->S2.2.1->S2.2->S2.2.2

前序和中序都给出了,那么后序遍历也一起分析下吧:

1. 后序遍历会先访问节点的左子树和右子树,最终才会访问当前节点,所以会寻找“Book” 的左子树,最终寻找到"Section1.1"

2. “Section1.1”没有子树,所以会访问当前节点,然后再访问它的父节点的右子树,也就是”Chapter1“的右子树

3. 遵照后序的顺序,“Chapter1”的右子树会先访问“Section1.2.1”节点,然后是“Section1.2.2”节点,最终访问“Section1.2”节点

4. 访问完“Section1.2”之后,“Chapter1”的左子树和右子树算是都访问完毕了,可以访问“Chapter1”这个节点了。

4. 依照上面的顺序,整张图的访问顺序为:S1.1->S1.2.1->S1.2.2->S1.2->Ch1->S2.1->S2.2.1->S2.2.2->S2.2->Ch2->Book

通过以上的分析比较,相信你对这三种遍历算法已经有了一定的理解,对应这三种遍历的代码其实非常简单,使用递归的方式来实现,我们这里给出前序遍历代码,中序和后序可以自己尝试实现一下:

至此,树的遍历我们就讲完了,二叉树的三种遍历形式,通过递归是很容易实现的。树的遍历算法,在实际项目中常常会用到,是非常重要的算法,大家好好跟着今天的案例过一遍,就能真切的理解这三种遍历算法是如何工作的了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值