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

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

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

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

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

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

图 1:左右子树和根节点

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

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

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

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

class TreeNode:
    def __init__(self,x):
        self.val = x
        self.left = None
        self.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:
            return
        print(node.val)
        self.preorder(node.left)
        self.preorder(node.right)
    def inorder(self,node): #中序遍历
        if node is None:
            return
        self.inorder(node.left)
        print(node.val)
        self.inorder(node.right)
    def postorder(self,node): #后序遍历
        if node is None:
            return
        self.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

Sort - Sorted - 快排 (python 阅读详情

相关推荐

关于快速排序算法Python详解

Wind数据显示,截至10:50,离岸人民币对美元汇率报7.3105元,较前收盘价跌25基点,盘中最低报7.3115元;在岸人民币对美元汇率报7.2734元,较前收盘价跌20基点,盘中最低报7.2736元,均创去年11月中旬以来新低。中国银行研究院发布的《2024年三季度经济金融展望报告》显示,今年上半年人民币汇率在亚洲货币中表现稳定,随着一些发达经济体启动降息,下半年人民币有望走向升值。Wind数据显示,截至记者发稿时,今年以来,离岸、在岸人民币对美元汇率累计下跌2.57%、2.55%。

WSH2012ffff的博客 368

使用Python实现快速排序算法

然后,我们递归地对左右两部分进行快速排序,并将结果合并起来。快速排序的基本思想是分治法,即将一个大问题分解成若干个小问题,然后递归解决这些小问题并将结果合并起来。快速排序是一种常用的排序算法,它的特点是速度非常快。在本文中,我们将使用Python编写快速排序算法,并提供相应的源代码。总之,使用Python实现快速排序算法非常简单,并且该算法具有优秀的时间复杂度和空间复杂度,在处理大规模数据时非常高效。函数对数组进行排序,并输出排序后的结果。函数对数组进行排序,并输出排序后的结果。

学习使你进步。 308

算法-二叉树-前序、中序、后序遍历图解+python3实现

0.简介 本文主要内容有: 介绍二叉树概念 使用图解,简单直观地阐述了二叉树前序、中序、后序遍历的方法 使用python3 编程实现二叉树,并进行了前序、中序、后序遍历。   1.二叉树概念(来源于百度百科) 二叉树是每个结点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 ...

qq_17753903的博客 7502

python3实现二叉树遍历与递归算法解析

python3实现二叉树遍历与递归算法解析 1、二叉树的三种遍历方式 二叉树有三种遍历方式:先序遍历,中序遍历,后续遍历 即:先中后指的是访问根节点的顺序 eg:先序 根左右 中序 左根右 后序 左右根 遍历总体思路:将树分成最小的子树,然后按照顺序输出 1.1 先序遍历 a 先访问根节点 b 访问左节点 c 访问右节点 a(b ( d ( h ) )( e ( i ) ))( c...

人生代码 ---- 公众号 1286

Python实现快速排序

Python实现快速排序

weixin_43790276的博客 3万+

Python——排序方法

(1)快速排序 快速排序采用分而治之及递归方法进行实现,将一个较大的序列进行分割。 该方法步骤为:1、选取基准值;2、分割:重新排序数列,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准后面;3、递归排序子序列:递归地将小于基准值元素的子序列和大于基准值元素的子序列排序。 def quick_sort(arr): if len(arr) >= 2: ...

yixinluobo的博客 4200

python实现二叉树遍历(递归/非递归/层序)

遍历二叉树就是以一定的规则将二叉树中的结点排列成一个线性序列,从而得到二叉树节点的各种遍历序列。其实质就是对一个非线性结构进行线性操作,使在这个序列中,除了第一个和最后一个结点,每个结点都有一个直接前驱和直接后继。如果二叉树为空,则什么也不做;否则:1.访问根节点2.先序遍历左子树3.先序遍历右子树如果二叉树为空,则什么也不做;否则:1.中序遍历左子树2.访问根节点3.中序遍历右子树如果二叉树为空,则什么也不做;否则:1.后序遍历左子树2.后序遍历右子树。

liulanba的博客 3万+

二叉树 中序遍历 python_Python3算法十一二叉树的中序遍历

本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的。建议您在PC浏览器中阅读本文,以获得更好的阅读体验。如果您未掌握知识提要中的内容,建议您先掌握这些内容之后再阅读本文。知识提要1、二叉树2、递归、栈3、线索二叉树4、莫里斯遍历0问题描述 实现一个函数,给定一棵二叉树,返回二叉树的中序遍历序列。 如果你不了解二叉树,请先前往如下网站了解:二叉树_百度百科...

weixin_39796868的博客 649

python二叉树的创建和遍历

树的相关定义参考资料:二叉树Python实现 - 山阴少年 - 博客园 树的定义与基本术语   树型结构是一类重要的非线性数据结构,其中以树和二叉树最为常用,是以分支关系定义的层次结构。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构;在计算机领域中也有广泛应用,如在编译程序中,可用树来表示源程序的语法结构;在数据库系统中,树型结构也是信息的重要组织形式之一;在机器学习中,决策树,随机森林,GBDT等是常见的树模型。   树(Tree)是n(n≥0)个结点的有限集。在任意一棵树中:(1)

Gordennizaicunzai的博客 1197

二叉树的垂直遍历

今天的这道签到题是今年(2024)我第一道有成就感的题目,毕竟是今年第一道自己独立解决的困难题。过年的这几天签到题都是DFS算法或BFS算法,这些天的练习让我对这两种算法有更深的理解。今天的这道题更是让我对前些天的练习有一个综合运用。也让我对之后的算法练习和学习有更大的鼓舞,算法这个东西如果我们能够凭借自己的努力解出来那是相当有成就感的,上次有这种成就感还是大一的时候做高数题。总而言之,算法思维并不是天生就有的,我也并不是天赋很好的选手,只能凭借每天的算法练习来学习和掌握常见的算法题。

hand2some2的博客 2211

Python算法题集_二叉树的中序遍历

题目94:二叉树的中序遍历,给定一个二叉树的根节点 root ,返回 它的 中序 遍历

长孤秋落的札记 1946

python算法二叉树的所有遍历方法,以leetcode题为例

对于前序遍历,也就是把中间的数先输出在输出左边的然后才是右边的。层序遍历(BFS)是二叉树遍历的基础算法,通过队列实现逐层访问节点,保证每层节点按从左到右顺序处理。依照上面的规律,后续遍历就是先输出左节点在输出右节点,最后输出根节点,所有称为后序。对于中序遍历,将根节点在中间输出,先输出左节点然后在输出根节点,最后输出右节点。对于层序遍历我们要用到队列来解决,如果对栈不清楚的可以去看看我的另外一篇。(即逐层地,从左到右访问所有节点)。给定一个二叉树的根节点。给你一棵二叉树的根节点。

m0_73426548的博客 1181

leetcode python3算法-根据一棵树的前序遍历与中序遍历构造二叉树

1.题目描述 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 2.思路 二叉树的前序遍历:规则是若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树 遍历的顺序为:ABDGH-CEIF 二叉树的中序遍历:规则是若树为空,则...

acarsar的博客 1027

LeetCode 困难 树 python3】145. 二叉树的后序遍历

想要看更加舒服的排版、更加准时的推送 关注公众号“不太灵光的程序员” 每日八点有干货推送,微信随时解答你的疑问 145. 二叉树的后序遍历 python3 困难 树 给定一个二叉树,返回它的 后序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [3,2,1] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? from typing import List # Definition for a binary tree node..

816

算法二叉树遍历算法总结:前序中序后序遍历

前言 二叉树遍历是非常经典的算法题,也是二叉树的一道基础算法题。 但是在平常的笔试面试中,其出现的频率其实并不是特别的高,我推测是这种题目相对来说比较基础,算是一个基础知识点。 比如剑指offer中出现的后序遍历题目,是给出一个数字序列,让你判断是不是平衡二叉树后序遍历序列,这样出题的难度比直接让你写后序遍历难很多。 但是,二叉树遍历容易吗?在递归方法下,前中后序遍历都是一个思路,理解起来也比较...

蛮三刀酱 5362

LeetCode 中等 树 python3】144. 二叉树的前序遍历

想要看更加舒服的排版、更加准时的推送 关注公众号“不太灵光的程序员” 每日八点有干货推送,微信随时解答你的疑问 144. 二叉树的前序遍历 python3 中等 树 迭代算法 给定一个二叉树,返回它的 前序 遍历。 示例: 输入: [1,null,2,3] 1 \ 2 / 3 输出: [1,2,3] 进阶: 递归算法很简单,你可以通过迭代算法完成吗? 前序遍历 根-左-右 from typing import List # Definition for a .

750

代码随想录算法训练营Day13 | 二叉树理论基础 二叉树的递归遍历 前序、中序、后序遍历 102.二叉树的层序遍历

① 满二叉树:顾名思义就是结点都满的二叉树。定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。 深度为k,结点数为2^k-1的二叉树② 完全二叉树:最后一层可以不满,但最后一层从左到右结点连续。 定义:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层(h从1开始),则该层包含 1~ 2^(h-1) 个节点。 ③ 二叉搜索树:有数值的有序树

weixin_65053787的博客 1977

二叉树遍历

二叉树遍历

qqrrjj2011的博客 1059

[面试算法]Python实现二叉树三种遍历的递归与非递归形式

二叉树及其数据结构定义 二叉树是计算机当中最重要的数据结构之一,其应用非常广泛,例如数据库的索引使用的B+树是一种特殊的二叉树,堆排序所使用的堆是一种特殊的二叉树,Java当中HashMap使用的红黑树是一种特殊的二叉树。可见,二叉树在计算机当中有着重要地位。二叉树遍历二叉树的基本操作,也是不仅是面试的常考考点,也是程序员用来锻炼思维的小把戏。 二叉树的定义是递归的,即满足如下条件的树是二叉树: 一棵树当中的每个节点,最多有2棵子树; 如果一个节点有子树,那么子树必须是二叉树。 我们可以看到,二叉树

tensory的博客 1053
上一篇: pandas重复值的处理
下一篇: 【python算法系列十二】平衡二叉树(AVL树)
m0_70372647
博客等级 码龄4年 225粉丝 17原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值