树的遍历(中序,前序,后序)

2023-11-05

与只有一种逻辑遍历它们的线性数据结构(数组、链表、队列、堆栈等)不同,树可以以不同的方式遍历,常见的有中序遍历,前序遍历和后序遍历。

实现各种遍历的方法又包括:

以上图为例:

深度优先遍历: 
(a)中序(左,根,右):4 2 5 1 3 
(b)前序(根,左,右):1 2 4 5 3 
(c)后序(左,右,根): 4 5 2 3 1

广度优先或级别顺序遍历:1 2 3 4 5

中序遍历的使用
在二叉搜索树 (BST) 的情况下,中序遍历以非递减顺序遍历节点。如果要以非递增顺序获取 BST 的节点,可以使用反向的中序遍历的变体。 
示例:上图中的中序遍历是 4 2 5 1 3。

前序遍历的使用 
前序遍历用于创建树的副本。前序遍历也用于获取表达式树上的前缀表达式。

示例:上图的前序遍历是 1 2 4 5 3。

后序遍历的使用 
后序遍历用于创建树的副本。后序遍历也用于获取表达式树上的后缀表达式。

示例:上图的后序遍历为 4 5 2 3 1。

注意:

中序,前序,后序三种不同遍历在算法上的不同主要体现在访问节点的时间不同,分别在遍历中,遍历前,遍历后访问。

再来一个例子:

前序遍历:

中序遍历:

后序遍历:

时间复杂度: O(n) 


让我们看看不同的极端情况。 
复杂度函数 T(n) — 对于涉及树遍历的所有问题 — 可以定义为:
T(n) = T(k) + T(n – k – 1) + c
其中 k 是根结点一侧的节点数,n - k - 1为另一侧的节点数。
让我们来分析一下极限情况
案例1:倾斜的树(其中一个子树为空,另一个子树为非空)
在这种情况下k为0。 
T(n) = T(0) + T(n-1) + c 
T(n) = 2T(0) + T(n-2) + 2c 
T(n) = 3T(0) + T(n- 3) + 3c  T(n) = 4T(0) + T(n-4) +
4c
……………………………………………………………………………… 
…………。 
T(n) = (n-1)T(0) + T(1) + (n-1)c 
T(n) = nT(0) + (n)c
T(0) 的值将变成某个常数,我们设为 d。(遍历一棵空树需要一些常数时间)
T(n) = n(c+d) 

因此T(n) = O(n) 

空间复杂度

如果我们不考虑函数调用的堆栈大小,那么 O(1) 否则 O(h) 其中 h 是树的高度。倾斜树的高度为 n(元素数量),因此最差的空间复杂度为 O(n),平衡树的高度为 (Log n),因此最佳空间复杂度为 O(Log n)。

 完整示例代码下载链接:

(包含各种语言:C语言、Python、Java,C++等均有示例)

免费​资源下载:树的遍历

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

树的遍历(中序,前序,后序) 的相关文章

随机推荐

  • tms xdata 中实现CRUD功能

    1 创建vcl工程 2 放置edit button组件 3 创建和销毁的代码 uses XData Client private Client TXdataClient procedure TForm1 FormCreate Sender
  • 小学生测验

    关于这段代码 数据存放在一个叫data的文件中 增加了结构体排序 对小学生们的成绩排名 其他要求如同题干 大一时写的版本 没文件读写 大三时写的在下面 项目一 小学生测验 16学时 问题描述 面向小学1 2年级学生 随机选择两个整数的加减法
  • Go的for循环

    在Go语言中 循环是通过for关键字来实现的 Go语言提供了三种基本的循环方式 for循环 range循环和for range循环 for循环 for 初始化语句 循环条件 循环后执行语句 循环体代码 初始化语句用于初始化循环变量 循环条件
  • 单例模式详解,包括应用场景及懒汉式的线程安全问题

    什么是单例模式 所谓类的单例设计模式 就是采取一定的方法保证在整个的软件系统中 对某个类只能存在一个对象实例 并且该类只提供一个取得其对象实例的方法 如果我们要让类在一个虚拟机中只能产生一个对象 我们首先必须将类的构造器的访问权限设置为pr
  • win操作iOS UI自动化(tidevice+appium)

    1 安装 tidevice 使用命令 pip install tidevice 2 使用数据线连接手机 打出命令 tidevice list查看连接状态和udid 若有信息返回则连上 3 输入启动命令 启动wda包 tidevice u 设
  • Java链表-合并两个有序链表

    如何将两个有序链表合成一个新的有序链表 基本思想 定义一个新链表 定义一个新链表的指针tempNode 当合并的两个链表的头节点指针都不指向空时 比较两个链表节点的值 找到里面较小的值的地址 让新链表的指针tempNode下一个节点指向该最
  • 数据分析基础目录

    自从大数据技术火热之后 现在数据分析也火热了 至少我就有两个女同事转数据分析失败哈 不是我不帮她们 实在是帮不动 哈哈 这两个人都是英语专业的 一个是文学学士 一个是文学硕士 专业跨得太大了 但是我想说我转数据分析肯定会成功的 不因为别的
  • gitlab ci 使用

    gitlab ce与gitlab runner使用 采用docker方式运行gitlab ce 运行两个gitlab runner 一个运行在容器中 另一个安装在宿主机上 运行gitlab ce和gitlab runner容器 下载镜像 d
  • 【统计学习方法-李航-笔记总结】二、感知机(感知机的原始形式与对偶形式)

    本文是李航老师 统计学习方法 第二章的笔记 欢迎大佬巨佬们交流 主要包括以下几部分 1 感知机模型 2 感知机策略 3 感知机算法 1 感知机模型 感知机是二分类的线性分类模型 其输入为实例的特征向量 输出为实例的类别 取 1和 1两个值
  • 用OpenPose做一个运动量测量器

    代码 https github com B C WANG AI Apps tree master openpose app MotionMeasure 通过openpose获得肢体关键点的位置信息 利用脖子位置作为中心点求得相对位置 然后用
  • Windows MYSQL跳过密码登录以及密码修改

    MYSQL跳过密码登录以及密码修改 1 以管理员身份打开命令行 输入命令 net stop mysql 如果不是管理员身份 可能会出现如下错误 2 开启跳过密码验证登录的MySQL服务 在命令行输入 mysqld console skip
  • 神经网络是如何训练的,神经网络是怎么训练的

    想要学习人工神经网络 需要什么样的基础知识 人工神经网络理论百度网盘下载 链接 提取码 rxlc简介 本书是人工神经网络理论的入门书籍 全书共分十章 第一章主要阐述人工神经网络理论的产生及发展历史 理论特点和研究方向 第二章至第九章介绍人工
  • 机械臂抓取前言

    一 机械臂的一些相关概念 自由度 除去末端执行器一个机械臂上有几个电机就是几自由度机械臂 二 机械臂的抓取流程 1 读取深度摄像头的数据 2 在摄像头传输过来的图像中识别要抓取的物体 并且得到想要抓取物体的二维的像素坐标 3 将二维像素坐标
  • IDEA让包分层显示的方式

    IDEA中java包分层显示的方式 初次使用IDEA的朋友 有部分的包显示是如此显示 但是这么显示 有时会因为包的同级显示 使得包使得包的显示过多 此时就可以改变显示的方式 小齿轮 gt gt Flatten Packages Middle
  • usbcan系列便携式can分析仪

    简介 USBCAN系列便携式CAN分析仪 通过USB接口快速扩展一路CAN通道 使接入CAN网络非常容易 它具有一体式和小巧紧凑的外形 特别适合于随身携带 CAN接口采用金升阳电源模块和信号隔离芯片实现2500V DC电气隔离 USB接口E
  • 前端Vue自定义得分构成水平柱形图组件 可用于系统专业门类得分评估分析

    引入Vue自定义得分构成水平柱形图组件 cc horBarChart 随着技术的发展 传统的开发方式使得系统的复杂度越来越高 一个小小的改动或小功能的增加可能会导致整体逻辑的修改 造成牵一发而动全身的情况 为了解决这个问题 我们采用了组件化
  • 官方推荐U盘安装Ubuntu 10.10 方法

    通用USB Installer是一个Linux系统安装器 允许你从你的USB闪存驱动器选择安装一个Linux发行版 通用USB安装器使用非常方便 只需选择一个 Linux发行版的ISO文件和你的U盘便能进行安装 Universal USB
  • java用模板生成word(docx)文档(含动态表格)

    生成word思路 用WPS或者office编辑好word的样式 然后另存为word xml文档 将xml翻译为FreeMarker模板 最后用java来解析FreeMarker模板并输出Docx 编辑好需要使用的word文档 1 把需要注入
  • 在Linux上面如何部署jar包?

    1 首先打开工具Xshell或者FinalShell 并登录 2 使用 ll 命令查看根目录文件 确定jar包将要放到哪个位置 使用cd 命令进入文件 如 cd opt yt 3 新建文件传输 可和本地关联 4 将jar包直接拖过去就行 5
  • 树的遍历(中序,前序,后序)

    与只有一种逻辑遍历它们的线性数据结构 数组 链表 队列 堆栈等 不同 树可以以不同的方式遍历 常见的有中序遍历 前序遍历和后序遍历 实现各种遍历的方法又包括 以上图为例 深度优先遍历 a 中序 左 根 右 4 2 5 1 3 b 前序 根