二叉树的遍历是指从根结点出发,按照某种次序依次访问二叉树中所有结点,使得每个结点被访问一次且仅被访问一次。

遍历二叉树的方法主要分 3 种:先序遍历、中序遍历和后序遍历:

  • 先序遍历指最先遍历节点本身,再遍历节点的左子树,最后遍历右子树的遍历方法;
  • 中序遍历指最先遍历节点的左子树,再遍历节点本身,最后遍历右子树的遍历方法;
  • 后序遍历指最先遍历节点的左子树,再遍历右子树,最后遍历节点本身的一种遍历方法。

在图 1 中,L 是左子树,R 是右子树,D 当前节点。如果用这三个字母来表示 3 种遍历顺序,那么先序遍历是 DLR,中序遍历是 LDR,后序遍历是 LRD。

图 1:左右子树和根节点

我们可以看出,在遍历的过程中,无论使用哪种顺序,都是先遍历左子树,再遍历右子树。所以,遍历顺序的先、中、后,实际上是指当前节点在整个遍历顺序中的位置。三种遍历的代码大同小异,注意语句的排列顺序即可。

下面首先是以列表下标表示的二叉树的遍历代码:

def preorder(i): #先序遍历if tree[i] == 0:returnprint(tree[i])preorder(2*i)preorder(2*i+1)
def inorder(i): #中序遍历if tree[i] == 0:returninorder(2*i)print(tree[i])inorder(2*i+1)
def postorder(i): #后序遍历if tree[i] == 0:returnpostorder(2*i)postorder(2*i+1)print(tree[i])

其次,是以存储的左右孩子地址来表示的二叉树,它的遍历函数写在类的内部:

class TreeNode:def __init__(self,x):self.val = xself.left = Noneself.right = None
class BST:def __init__(self, tlist):self.root = TreeNode(tlist[0])for i in tlist[1:]:self.insert(i)def preorder(self,node): #先序遍历if node is None:returnprint(node.val)self.preorder(node.left)self.preorder(node.right)def inorder(self,node): #中序遍历if node is None:returnself.inorder(node.left)print(node.val)self.inorder(node.right)def postorder(self,node): #后序遍历if node is None:returnself.postorder(node.left)self.postorder(node.right)print(node.val)

二叉树的遍历就结束了。

算法系列文章:

【python算法系列一】冒泡排序算法采用重复遍历数组并依次比较相邻元素的方法来排序。由于在冒泡算法进行排序的过程中,最大数/最小数会慢慢“浮”到数组的末尾,所以算法由此命名。https://blog.csdn.net/m0_70372647/article/details/124736577

【python算法系列二】快速排序算法快速排序的思想是:取数组中的一个数作为基准值,把所有小于基准值的数都放在它的一侧,再把所有大于基准值的数都放在它的另一侧。随后,对基准值左右两侧的数组分别进行快速排序。由此可以看出,快速排序的整个排序过程也是递归进行的。快速排序的平均时间复杂度是 O(nlgn),最好情况下的时间复杂度是 O(nlgn)。最坏情况下,快速排序的时间复杂度可能退化成 O(n2),但这种情况很少见。它的空间复杂度是 O(nlgn)。它是一个不稳定的排序算法。如果使用得当,快速排序的速度可以达到归并排序和堆排序的数倍,所以.https://blog.csdn.net/m0_70372647/article/details/124758205【python算法系列三】 希尔排序算法希尔排序,又叫“缩小增量排序”,是对插入排序进行优化后产生的一种排序算法。它的执行思路是:把数组内的元素按下标增量分组,对每一组元素进行插入排序后,缩小增量并重复之前的步骤,直到增量到达 1。一般来说,希尔排序的时间复杂度为 O(n1.3)~O(n2),它视增量大小而定。希尔排序的空间复杂度是 O(1),它是一个不稳定的排序算法。进行希尔排序时,元素一次移动可能跨越多个元素,从而可能抵消多次移动,提高了效率。下面是使用(数组长度/2)作为初始增量的升序希尔排序,每一轮排序过后,增量都缩小一半。1) 如https://blog.csdn.net/m0_70372647/article/details/124808637【python算法系列四】堆排序算法堆排序,就像它的名字一样,利用了堆的特性来进行排序。实现堆排序的思路是,把数组构建成一棵二叉树,并随着每次堆的变化更新堆顶的最大/最小值。堆排序的时间复杂度在所有情况下都是 O(nlgn),它也是一个不稳定的算法。在开始编写堆排序的程序之前,我们首先要了解“堆”的概念。堆是一种数据结构,它是一种特殊的完全二叉树:如果这个堆是一个大顶堆(最大的元素在堆顶),那么每个节点上的元素都应该比它的子节点上的元素要大,最大的元素在根节点上;反之,如果是小顶堆,那么每个节点上的元素都应该比它的子节点小,最小的元素在根节https://blog.csdn.net/m0_70372647/article/details/124870580【python算法系列五】桶排序算法由于桶排序算法把每个数都放到合适的“桶”里进行排序,因此而得名。桶排序的算法原理可以理解为创建一个新的数组,把数依次放入合适的桶内,再按一定顺序输出桶。当每个桶的数据范围为 1 且数据皆为整数时,桶排序的时间复杂度在所有情况下都是 O(n),因为它是一个线性的排序算法。但是,它的空间需求要视排序数据的范围而定,所以极有可能浪费很多空间。假设我们有 10 个整数 [1,1,3,19,35,49,50,5,10,16],它们的范围在 1~50。如图 1 所示,我们建立 50 个存放数据的桶。图 1:https://blog.csdn.net/m0_70372647/article/details/124871084【python算法系列六】选择排序算法选择排序表示从无序的数组中,每次选择最小或最大的数据,从无序数组中放到有序数组的末尾,以达到排序的效果。选择排序的平均时间复杂度是O(n2),最好情况下的时间复杂度和最坏情况下的时间复杂度都是 O(n2)。另外,它是一个不稳定的排序算法。选择排序的过程如下;1) 如图 1 所示,我们仍以递增排序的算法为例,先遍历未排序的数组,找到最小的元素。然后,把最小的元素从未排序的数组中删除,添加到有序数组的末尾。因为最小的元素是 1,所以 1 被添加到仍为空的有序数组末尾。图 1:选择并放置第一个元素https://blog.csdn.net/m0_70372647/article/details/124897318【python算法系列七】插入排序算法排序通常指把毫无规律的数据,按照一种特定的规律,整理成有序排列的状态。一般情况下,排序算法按照关键字的大小,以从小到大或从大到小的顺序将数据排列。排序算法是最基础也是最重要的算法之一,在处理大量数据时,使用一个优秀的排序算法可以节省大量时间和空间。因为不同的排序算法拥有不同的特点,所以我们应根据情况选择合适的排序算法。初级排序算法是指几种较为基础且容易理解的排序算法。初级排序算法包括插入排序、选择排序和冒泡排序 3 种。虽然它们的效率相对于高级排序算法偏低,但是在了解初级排序算法之后,再去学习相对复https://blog.csdn.net/m0_70372647/article/details/124907803

【python算法系列八】归并排序算法相比起初级排序算法,高级排序算法往往有更加复杂的逻辑,但也会有更高的时间或空间效率。其中有些高级排序算法是由初级排序算法优化而来的。在处理大量数据时,高级排序算法的一般更加常用。本节教程介绍的第一种高级排序算法是归并排序。“归并”一词,意为“合并”。顾名思义,归并排序算法就是一个先把数列拆分为子数列,对子数列进行排序后,再把有序的子数列合并为完整的有序数列的算法。它实际上采用了分治的思想,之后我们会深度讲解分治思想。归并排序的平均时间复杂度是 O(nlgn),最好情况下的时间复杂度是 O(nlg.https://blog.csdn.net/m0_70372647/article/details/124908304 【Python算法系列九】 顺序查找算法定义查找的定义为:在一个数据元素集合中,通过一定的方法确定与给定关键字相同的数据元素是否存在于集合中。一般来说,如果查找成功,程序会返回数据的位置或相关信息;如果查找失败,则返回相应的提示。查找的方法可以分为两种:比较查找法与计算式查找法。比较查找法基于两种数据结构:线性表和树。查找的对象(一般是由同一类型的数据元素/记录构成的集合)又可以被称为查找表。查找还分为静态查找和动态查找。对查找表进行静态查找时,程序只进行查找并返回信息;进行动态查找时,在静态查找的基础上,还增加了增删查找表中.https://blog.csdn.net/m0_70372647/article/details/124931956

【Python算法系列十】二分查找算法二分查找,也叫折半查找,是一种适用于顺序存储结构的查找方法。它是一种效率较高的查找方法,时间复杂度为 O(lgn),但它仅能用于有序表中。也就是说,表中的元素需按关键字大小有序排列。二分查找用左右两个指针来标注查找范围。程序开始时,查找范围是整个线性表,左指针指向第一个元素,右指针指向最后一个元素;每一次循环过后,查找范围都缩小为原先的一半,直到左右指针重叠或者左指针处于右指针的右侧。因为每次缩小一半的范围,所以可以得出二分查找的时间复杂度为 O(lgn)。...https://blog.csdn.net/m0_70372647/article/details/124936085

【Python算法系列十一】二叉树的3种遍历方式相关推荐

  1. 详解二叉树的三种遍历方式(递归、迭代、Morris算法)

    详解二叉树的三种遍历方式(递归.迭代.Morris算法) 最重要的事情写在前面:遍历顺序不一定就是操作顺序!!! 递归解法 首先,一颗二叉树它的递归序列是一定的,导致其前中后序不同的原因只不过是访问节 ...

  2. c语言中二叉树中总结点,C语言二叉树的三种遍历方式的实现及原理

    二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个名字?是根据根节点的顺序命名的. 比如上图正常的一个满节点,A:根节点.B:左节点.C:右节点,前序顺序是ABC(根节点排最先,然后 ...

  3. 二叉树的三种遍历方式(递归、非递归和Morris遍历)

    二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...

  4. c语言二叉树的遍历菜单系统,C语言二叉树的三种遍历方式的实现及原理

    C语言二叉树的三种遍历方式的实现及原理 发布时间:2020-10-03 19:43:57 来源:脚本之家 阅读:63 作者:看雪. 二叉树遍历分为三种:前序.中序.后序,其中序遍历最为重要.为啥叫这个 ...

  5. 二叉树的四种遍历方式

    二叉树的四种遍历方式: 二叉树的遍历(traversing binary tree)是指从根结点出发,按照某种次序依次访问二叉树中所有的结点,使得每个结点被访问依次且仅被访问一次. 四种遍历方式分别为 ...

  6. 二叉树的三种遍历方式:前序遍历、中序遍历和后序遍历

    二叉树的三种遍历方式:前序遍历.中序遍历和后序遍历 参考资料: 二叉树.前序遍历.中序遍历.后序遍历 - 蓝海人 - 博客园 (cnblogs.com) 二叉树 - LeetBook - 力扣(Lee ...

  7. python数据结构与算法:二叉树及三种遍历方式(先序遍历/中序遍历/后序遍历)

    树的实现采用queue的形式: 树的三种遍历方式(广度优先白能力法):先序遍历(根左右),中序遍历(左根右)以及后序遍历(左右根) ######################P6.4 数据结构### ...

  8. 二叉树的四种遍历方式——前序、中序、后序、层序遍历(递归+非递归实现)

    如果N代表根节点,L代表根节点的左子树,R代表根节点的右子树,则根据遍历根节点的先后次序有以下遍历方式: 1. NLR:前序遍历(Preorder Traversal 亦称先序遍历)--访问根结点-- ...

  9. 二叉树的四种遍历方式(递归和非递归双重实现)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

最新文章

  1. 图片转字符 android,转字符图app下载-转字符图 安卓版v2.4-PC6安卓网
  2. Java中throw re_详解Java编程中throw和throws子句的使用方法
  3. button/input链接方式全攻略 [转]
  4. Java中List的父类与子类如何转换
  5. 数据竞赛:记录3天进入比赛Top3%的全过程
  6. 用函数计算工龄_还在加班熬夜求年龄,算工龄,学会这招让你分分钟钟搞定这些!...
  7. Windows Server 2008关闭默认windows共享
  8. ThreadLocal 在web环境下使用的边界问题
  9. 解决使用elementUI框架el-upload上传组件时session丢失问题
  10. python读音有道-Python实现有道翻译+语音播报
  11. R︱mlr包挑选最适机器学习模型+变量评估与选择(案例详解)
  12. php的process_field,使用Boost :: Process运行php命令
  13. CAM350 12.1(附补丁)
  14. ORB SLAM论文
  15. php集成环境安装包比较,PHP集成环境phpStudy安装包分享
  16. c语言 无锁编程,无锁编程与有锁编程的效率总结、无锁队列的实现(c语言)
  17. 2020年书法落款_2020鼠年书法落款怎么写?
  18. EXCEL打开文件显示“文件已损坏,无法打开。”
  19. c语言入门-5-字符串
  20. 华为python自动化测试框架_10个自动化测试框架,测试工程师用起来

热门文章

  1. matlab+BP神经网络实现手写体数字识别
  2. C语言经典100例---实例九:输出国际象棋棋盘
  3. 上海科技大学计算机考研分数,上海科技大学2021年考研复试分数线已公布
  4. OSChina 周六乱弹 ——今年又让支付宝赢了
  5. video 自动播放
  6. 白头发越来越多怎么办?30多岁白头发越来越多怎么办?
  7. Alpha多样性 Beta多样性
  8. 按照某个VSAM文件去定义新的VSAM文件
  9. POS机刷卡失败的郁闷事
  10. 计算机网络 数据传输方式