24考研数据结构-二叉树的遍历

news2025/1/18 21:05:21

目录

  • 5.3二叉树的遍历和线索二叉树
    • 数据结构:树的遍历
      • 前序遍历
      • 中序遍历
      • 后序遍历
      • 层次遍历
      • 遍历方法的选择
      • 结论
    • 树的遍历应用
    • 5.3.1二叉树的遍历
      • 1. 先序遍历(根左右 NLR)
      • 2. 中序遍历(左根右 LNR)
      • 3. 后续遍历(左右根 LRN)
      • 4. 求树的深度(递归应用)
      • 5. 非递归遍历
      • 6. 层次遍历
      • 7. 由遍历序列构造二叉树

5.3二叉树的遍历和线索二叉树

数据结构:树的遍历

在计算机科学中,树是一种常见的数据结构,它由节点组成,每个节点可以有零个或多个子节点,形成了一个层次结构。树的遍历是指按照一定规则遍历树的所有节点,以便访问和处理节点的数据。树的遍历有多种方法,包括前序遍历、中序遍历、后序遍历和层次遍历。本文将对这四种遍历方法进行介绍和比较。

前序遍历

前序遍历是一种深度优先的遍历方法,它首先访问根节点,然后按照从左到右的顺序依次遍历根节点的所有子树。具体步骤如下:

  1. 访问根节点。
  2. 对根节点的每个子树,递归执行前序遍历。

前序遍历的遍历顺序为:根节点 -> 左子树 -> 右子树。

中序遍历

中序遍历也是一种深度优先的遍历方法,它按照从左到右的顺序遍历根节点的所有子树,并在遍历完左子树后访问根节点,最后遍历右子树。具体步骤如下:

  1. 对根节点的左子树,递归执行中序遍历。
  2. 访问根节点。
  3. 对根节点的右子树,递归执行中序遍历。

中序遍历的遍历顺序为:左子树 -> 根节点 -> 右子树。

后序遍历

后序遍历是一种深度优先的遍历方法,它首先按照从左到右的顺序遍历根节点的所有子树,然后访问根节点。具体步骤如下:

  1. 对根节点的每个子树,递归执行后序遍历。
  2. 访问根节点。

后序遍历的遍历顺序为:左子树 -> 右子树 -> 根节点。

层次遍历

层次遍历是一种广度优先的遍历方法,它按照从上到下、从左到右的顺序逐层遍历树的节点。具体步骤如下:

  1. 从根节点开始,将根节点入队。
  2. 当队列不为空时,循环执行以下步骤:
    • 出队一个节点,并访问该节点。
    • 将该节点的所有子节点入队。

层次遍历的遍历顺序为:根节点 -> 第二层节点 -> 第三层节点 -> … -> 最后一层节点。

遍历方法的选择

在实际应用中,选择不同的遍历方法取决于对数据的需求和处理方式。如果需要按照树的层次结构处理数据,层次遍历是一个较好的选择。而如果需要对树的节点进行某种特定顺序的处理,可以考虑使用前序、中序或后序遍历。根据不同的情况,可以灵活地选择合适的遍历方法。

结论

树是一种重要的数据结构,在处理树的数据时,遍历是一种常用的操作。前序遍历、中序遍历、后序遍历和层次遍历是常见的树的遍历方法,它们各自有着不同的遍历顺序和应用场景。在实际应用中,根据对数据的需求和处理方式,可以灵活地选择合适的遍历方法来处理树的节点数据。

树的遍历应用

树的遍历在很多实际应用中都有着重要的作用。以下是树的遍历应用的一些例子:

  1. 查找特定节点: 可以使用中序遍历在二叉搜索树中查找特定节点。

  2. 树的复制: 可以使用前序遍历来复制一棵树。

  3. 表达式求值: 可以使用后序遍历在二叉树表示的表达式中进行求值。

  4. 文件系统遍历: 文件系统可以被表示为一棵树,通过遍历文件系统树,可以对文件进行管理和处理。

  5. 图的遍历: 图可以看作是特殊的树结构,对图进行遍历可以用于寻找路径等应用。

5.3.1二叉树的遍历

在这里插入图片描述
在这里插入图片描述

1. 先序遍历(根左右 NLR)

若二叉树为空,不用操作

若二叉树非空:

  • 访问根节点
  • 先序遍历左子树
  • 先序遍历右子树
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void PreOrder(BiTree T){
   if(T!=NULL){
      visit(T);                 //访问根结点
      PreOrder(T->lchild);      //递归遍历左子树
      PreOrder(T->rchild);      //递归遍历右子树
   }
}


2. 中序遍历(左根右 LNR)

若二叉树为空,不用操作

若二叉树非空:

  • 先序遍历左子树
  • 访问根节点
  • 先序遍历右子树
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void InOrder(BiTree T){
   if(T!=NULL){
      InOrder(T->lchild);       //递归遍历左子树
      visit(T);                 //访问根结点
      InOrder(T->rchild);       //递归遍历右子树
   }
}


3. 后续遍历(左右根 LRN)

若二叉树为空,不用操作

若二叉树非空:

  • 先序遍历左子树
  • 先序遍历右子树
  • 访问根节点
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

void PostOrder(BiTree T){
   if(T!=NULL){
      PostOrder(T->lchild);       //递归遍历左子树    
      PostOrder(T->rchild);       //递归遍历右子树
      visit(T);                 //访问根结点
   }
}

4. 求树的深度(递归应用)

在这里插入图片描述

5. 非递归遍历

  1. 先序遍历
    在这里插入图片描述
    在这里插入图片描述

  2. 中序遍历
    在这里插入图片描述

  3. 后序遍历
    在这里插入图片描述
    在这里插入图片描述

6. 层次遍历

在这里插入图片描述

//二叉树的结点(链式存储)
typedef struct BiTnode{
   ElemType data;          
   struct BiTNode *lchild, *rchild; 
}BiTNode, *BiTree;

//链式队列结点
typedef struct LinkNode{
   BiTNode * data;
   typedef LinkNode *next;
}LinkNode;

typedef struct{
   LinkNode *front, *rear;  
}LinkQueue;

//层序遍历
void LevelOrder(BiTree T){
   LinkQueue Q;
   InitQueue (Q);          //初始化辅助队列
   BiTree p;
   EnQueue(Q,T);           //将根节点入队
   while(!isEmpty(Q)){     //队列不空则循环
      DeQueue(Q,p);        //队头结点出队
      visit(p);            //访问出队结点
      if(p->lchild != NULL)
         EnQueue(Q,p->lchild);   //左孩子入队
      if(p->rchild != NULL)
         EnQueue(Q,p->rchild);   //右孩子入队
   }
}


7. 由遍历序列构造二叉树

给定的二叉树的遍历序列是固定的;给定遍历序列得到的二叉树是不固定的

  • 先序序列 + 中序序列
  • 后序序列 + 中序序列
  • 层序序列 + 中序序列

key: 找到树的根节点,并根据中序序列划分左右子树,再找到左右子树根节点
这也是为什么一定要有中序序列的原因
其他的遍历序列不能判断左子树和右子树的相对位置关系

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/829181.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Jenkins+Python+Ubuntu+Docker的接口/UI自动化测试环境部署详细过程

基于JenkinsPythonUbuntuDocker的接口/UI自动化测试环境部署详细过程 1 Jenkins是什么?2 Jenkins目标是什么?3 什么是CI/CD?3.1 CI持续集成3.2 CD持续部署3.3 CD持续交付 4 Ubuntu环境4.1 环境需求4.2 实现思路 5 Ubuntu下安装Docker6 安装Jenkins6.1 拉…

电力巡检无人机助力迎峰度夏,保障夏季电力供应

夏季是电力需求量较高的时期,随着高温天气的来临,风扇、空调和冰箱等电器的使用量也大大增加,从而迎来夏季用电高峰期,电网用电负荷不断攀升。为了保障夏季电网供电稳定,供电公司会加强对电力设施设备的巡检&#xff0…

新抗原预测的计算工作流程

参考文献:Xie N, Shen G, Gao W, Huang Z, Huang C, Fu L. Neoantigens: promising targets for cancer therapy. Signal Transduct Target Ther. 2023 Jan 6;8(1):9. doi: 10.1038/s41392-022-01270-x. PMID: 36604431; PMCID: PMC9816309. 文章目录 *新抗原预测的…

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原

【腾讯云 Cloud Studio 实战训练营】使用Cloud Studio快速构建React完成点餐H5页面还原 一、前言二、Cloud Studio 简介1.Cloud Studio 是什么2.Cloud Studio 的优点 三、Cloud Studio 登录注册四、Cloud Studio 的初体验五、使用 Cloud Studio 开发一个简版的点餐系统1.安装 a…

开源元数据管理平台Datahub最新版本0.10.5——安装部署手册(附离线安装包)

大家好,我是独孤风。 开源元数据管理平台Datahub近期得到了飞速的发展。已经更新到了0.10.5的版本,来咨询我的小伙伴也越来越多,特别是安装过程有很多问题。本文经过和群里大伙伴的共同讨论,总结出安装部署Datahub最新版本的部署手…

SpringCloud深入理解 | 生产者、消费者

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! SpringCloud Spring Cloud是一组用于构建分布式系统和微服务架构的开源框架和工具集合。它是在Spring生态系统的基础上构建的,旨在简化开发人员构建分布式…

Tomcat添加第三方jar包、如何在IDEA中启动部署Web模板

前言:公司最近维护老项目,是最原始的web项目,servlet和jsp结合的web项目,启动的时候配置了好几遍, 都起不来,很折磨人,这个文档比较全配置一遍准备工作 首先 拉取代码: git clone xxx.git ,如需要别的操作,自行baidu 也可以在idea中拉取第一步File ->Project Structure->…

张驰咨询:精益生产管理的独特特点和显著优势

精益生产管理是一种注重效率和优化生产流程的管理方法,旨在通过最小化浪费和提高生产效率来降低成本和提高产品质量。以下是精益生产管理的主要特点: 优化生产流程 精益生产管理强调通过优化生产流程来提高效率和降低成本。这包括通过标准化工作流程、…

【数据结构与算法】TypeScript 实现图结构

class Grapg<T> {// 用于存储所有的顶点verteces: T[] [];// 用于存储所有的边 采用邻接表的形式adjList: Map<T, T[]> new Map();// 添加顶点addVertex(v: T) {this.verteces.push(v);// 初始化顶点的邻接表this.adjList.set(v, []);}// 添加边addEdge(v: T, w:…

通向架构师的道路之Tomcat性能调优

一、总结前一天的学习 从“第三天”的性能测试一节中&#xff0c;我们得知了决定性能测试的几个重要指标&#xff0c;它们是&#xff1a; 吞吐量 Responsetime Cpuload MemoryUsage 我 们也在第三天的学习中对Apache做过了一定的优化&#xff0c;使其最优化上…

计算机视觉与图形学-神经渲染专题-ConsistentNeRF

摘要 Neural Radiance Fields (NeRF) 已通过密集视图图像展示了卓越的 3D 重建能力。然而&#xff0c;在稀疏视图设置下&#xff0c;其性能显着恶化。我们观察到&#xff0c;在这种情况下&#xff0c;学习不同视图之间像素的 3D 一致性对于提高重建质量至关重要。在本文中&…

总结了12句话,送给通信新员工

1、入职第一件事——改变形象。 刚毕业的大学生进入工作单位之后&#xff0c;需要尽快完成身份的转换——从一名学生&#xff0c;变身为一个职业人。 这个转换的第一步&#xff0c;就是改变形象外表。 大学里过于随意的穿搭&#xff0c;请一定不要带进单位&#xff0c;尤其是入…

Flowable-子流程-调用活动

目录 定义图形标记XML内容界面操作使用示例子流程设计子流程的XML内容主流程设计主流程的XML内容 视频教程 定义 调用活动是在一个流程定义中调用另一个独立的流程定义&#xff0c;通常可以定义一些通用的流程作为 这种调用子流程&#xff0c;供其他多个流程定义复用。这种子流…

✅1本期刊发生变动,EI期刊目录更新!

【SciencePub学术】继上次更新后一个月&#xff0c;爱思唯尔&#xff08;Elsevier&#xff09;官网更新了EI Compendex收录期刊目录。本次更新EI期刊目录中&#xff0c;Serials&#xff08;连续出版/核心收录&#xff09;列表共收录期刊名称5347个&#xff0c;与上次更新相比&a…

golang执行异步任务的第三方库jobrunner库实践

简介 我们在 Web 开发中时常会遇到这样的需求&#xff0c;执行一个操作之后&#xff0c;需要给用户一定形式的通知。例如&#xff0c;用户下单之后通过邮件发送电子发票&#xff0c;网上购票支付后通过短信发送车次信息。但是这类需求并不需要非常及时&#xff0c;如果放在请求…

Jenkins工具系列 —— 快速构建项目

文章目录 添加项目选择构建的项目添加项目参数添加项目仓库添加编译脚本 添加项目 选择构建的项目 添加项目参数 添加项目仓库 添加编译脚本

电脑技巧:分享五款非常实用的电脑软件,值得收藏

目录 1、RX文件管理器&#xff08;UWP&#xff09; 2、WizTree 3、QuickLook 4、优效日历 5、FastStone Capture 今天小编给大家分享非常实用的电脑软件&#xff0c;值得收藏&#xff01; 1、RX文件管理器&#xff08;UWP&#xff09; RX文件管理器是优雅的UWP文件管理器…

leetcode原题 路径总和 I II III(递归实现)

路径总和 I &#xff1a; 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。…

FreeRTOS源码分析-8 信号量

1 信号量概念及应用 信号灯解决的问题&#xff1a; 行人、车辆共享一个马路共享资源的问题&#xff0c;第二个解决通过的问题。 计数停车位的问题&#xff1a; 解决共享资源停车位计数的问题&#xff0c;因为车位是有限的&#xff0c;客流是无限的&#xff0c;计数可以很好的…

无涯教程-Lua - Iterators(迭代器)

迭代器是一种构造&#xff0c;使您可以遍历所谓的集合或集合的元素。在Lua中&#xff0c;这些集合通常引用表&#xff0c;这些表用于创建各种数据结构(如数组)。 通用迭代器 通用的 for 迭代器提供集合中每个元素的键值对。下面给出一个简单的示例。 array{"Lua",…