C++数据结构X篇_14_二叉树的递归遍历(先序遍历、中序遍历、后续遍历方法介绍;举例;代码实现)

我们知道数据的存储结构分为线性与非线性。线性就是1对1的结构,像栈与队列都属于线性结构。那什么是非线性的结构呢?
非线性即1对n的结构这更符合常规情况,线性结构本质上属于非线性结构中的一种特殊形式,像树就属于非线性结构。但是树并不适合编码操作,需要将其转为二叉树,既然二叉树是一种数据存储的结构,那就涉及到数据遍历的问题。有关二叉树的遍历有三种方式,即先序遍历、中序遍历与后续遍历。
本篇参考博文C++实现二叉树的递归遍历(详细步骤与代码实现)进行补充后进行介绍。

文章目录

  • 1. 二叉树遍历基本概念
    • 1. 1 遍历定义
    • 1. 2 遍历用途
    • 1. 3 遍历方法
  • 2. 二叉树的遍历举例
    • 2.1 先序遍历(DLR)
    • 2.2 中序遍历(LDR)
    • 2.3 后序遍历(LRD)
  • 3. 二叉树三种遍历方法代码实现
    • 3.1 先定义二叉树节点
    • 3.2 三种遍历方式
    • 3.3 创建案例中的二叉树
    • 3.4 遍历结果

1. 二叉树遍历基本概念

1. 1 遍历定义

指按某条搜索路线遍访每个结点且不重复(又称周游)。

1. 2 遍历用途

它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心

1. 3 遍历方法

牢记一种约定,对每个结点的查看都是“先左后右”,区别是访问根、左、右的顺序。
限定先左后右,树的遍历有三种实现方案:
DLR(先序遍历、根左右) 、 LDR (中序遍历、左根右) 、 LRD(后续遍历、左右根)

具体的遍历方法为:

  • DLR 一 先序遍历,即先根再左再右
  • LDR 一 中序遍历,即先左再根再右
  • LRD 一 后序遍历,即先左再右再根

注:“先、中、后”的意思是指访问的结点 D 是先于子树出现还是后于子树出现
从递归的角度看,这三种算法是完全相同的,或者说这三种遍历算法的访问路径是相同的,只是访问结点的时机不同。

技巧总结:先分析是否为一个树,是树就按照上述先什么后什么的顺序进行遍历

2. 二叉树的遍历举例

根据以下二叉树简单谈一下何为先序遍历、中序遍历与后序遍历:
在这里插入图片描述

2.1 先序遍历(DLR)

先从顶部二叉树节点A开始遍历,输出A——>寻找节点A的左子树,找到B,输出B,B为一个树继续遍历——>寻找节点B的左子树,没找到——>寻找节点B的右子树,找到节点C输出C,C为一个树继续遍历——>寻找节点C的左子树,找到D输出D,D不是一个树——>寻找节点C的右子树,找到E输出E,E不是一个树。

顶点A节点的左子树完全访问完毕,现在访问节点A的右子树,找到F输出F,F为一个树继续遍历——>寻找节点F的左子树,没找到——>寻找节点F的右子树,找到G输出G,G为一个树继续遍历——>寻找节点G左子树,找到H直接输出,H不是一个树——>寻找节点G右子树,没找到——>遍历完成,结束。

遍历结果为:ABCDEFGH

2.2 中序遍历(LDR)

先从顶部节点A开始——>寻找左子树,找到B,B为一个树——>寻找B节点左子树,没找到——>输出B——>寻找B节点右子树,找到C,C为一个树——>寻找C节点左子树,找到D,D不是一个树,输出D——>输出C——>寻找C节点右子树,找到E,E不是一个树,输出E。

A的左子树访问完毕——>输出A——>寻找节点A的右子树,找到F,F为一个树继续遍历——>寻找节点F的左子树,没找到——>输出F——>寻找节点F的右子树,找到G,G为一个树继续遍历——>寻找节点G的左子树,找到H,H不是一个树——>输出G——>寻找G的右子树,没找到——>遍历完成,结束。

遍历结果为:BDCEAFHC

2.3 后序遍历(LRD)

先从顶部节点A开始——>寻找左子树,找到B,B为一个树——>寻找B节点左子树,没找到——>寻找B节点右子树,找到C,C为一个树——>寻找节点C的左子树,找到D,D不是一个树直接输出——>寻找节点C右子树,找到E,E不是一个树直接输出——>输出节点C-——>输出节点B.

A的左子树访问完成,寻找A的右子树,找到F,F为一个树——>寻找节点F的左子树,没找到——>寻找节点F的右子树,找到G,G为一个树——>寻找节点G的左子树,找到G,H不是一个树直接输出——>寻找节点G右子树,没找到——>输出G——>输出F——>输出A——>遍历完成,结束。

遍历结果为:DECBHGFA

3. 二叉树三种遍历方法代码实现

3.1 先定义二叉树节点

//定义二叉树节点
class binarynode
{
public:char ch;			 //节点数据域binarynode* lchild;  //左孩子binarynode* rchild;  //右孩子
};

3.2 三种遍历方式

//递归遍历
//先序
void recursion_dlr(binarynode* root)
{if (root==NULL){return;}//遍历根节点cout<<root->ch<<"\t";//遍历左子树recursion_dlr(root->lchild);//遍历右子树recursion_dlr(root->rchild);
}
//中序
void recursion_ldr(binarynode* root)
{if (root==NULL){return;}//遍历左子树recursion_ldr(root->lchild);//遍历根节点cout<<root->ch<<"\t";//遍历右子树recursion_ldr(root->rchild);
}
//后序
void recursion_lrd(binarynode* root)
{if (root==NULL){return;}//遍历左子树recursion_lrd(root->lchild);//遍历右子树recursion_lrd(root->rchild);//遍历根节点cout<<root->ch<<"\t";
}

3.3 创建案例中的二叉树

//创建二叉树
void createtree()
{//创建节点binarynode node1={'A',NULL,NULL};binarynode node2={'B',NULL,NULL};binarynode node3={'C',NULL,NULL};binarynode node4={'D',NULL,NULL};binarynode node5={'E',NULL,NULL};binarynode node6={'F',NULL,NULL};binarynode node7={'G',NULL,NULL};binarynode node8={'H',NULL,NULL};//建立节点关系node1.lchild=&node2;node1.rchild=&node6;node2.rchild=&node3;node3.lchild=&node4;node3.rchild=&node5;node6.rchild=&node7;node7.lchild=&node8;cout<<"先序遍历:"<<endl;recursion_dlr(&node1);cout<<endl;cout<<"中序遍历:"<<endl;recursion_ldr(&node1);cout<<endl;cout<<"后序遍历:"<<endl;recursion_lrd(&node1);cout<<endl;
}

3.4 遍历结果

int main()
{createtree();system("pause");return 0;
}

在这里插入图片描述

4. 视频学习地址:二叉树的递归遍历

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

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

相关文章

neo4j下载安装配置步骤

目录 一、介绍 简介 Neo4j和JDK版本对应 二、下载 官网下载 直接获取 三、解压缩安装 四、配置环境变量 五、启动测试 一、介绍 简介 Neo4j是一款高性能的图数据库&#xff0c;专门用于存储和处理图形数据。它采用节点、关系和属性的图形结构&#xff0c;非常适用于…

6. 装饰器

UML 聚合(Aggregation)关系&#xff1a;大雁和雁群&#xff0c;上图中空心菱形箭头表示聚合关系组合(Composition)关系&#xff1a;大雁和翅膀 &#xff0c;实心菱形箭头表示组合(Composition)关系 测试代码 #include <iostream> #include <stdio.h> #include &l…

Spring复杂对象的3中创建方法

复杂对象是相对于简单对象可以直接 new 出的对象。这种对象在 Spring 中不可以通过简单对象的创建方式来创建。下面我们将通过实现 FactoryBean 接口、实例工厂、静态工厂三种方法来创建。 FactoryBean 接口 Spring 提供 FactoryBean 接口并且提供了 getObject 方法是为了支持…

“熊猫杯” | 赛宁网安获网络安全优秀创新成果大赛优胜奖

9月11日&#xff0c;四川省2023年国家网络安全宣传周正式启动。由四川省委网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办&#xff0c;成都信息工程大学、四川省网络空间安全协会承办的“2023年网络安全优秀创新成果大赛—成都分站赛(暨四川省‘…

Spring Boot - 用JUnit 5构建完美的Spring Boot测试套件

文章目录 PreJUnit 4 vs JUnit 5Junit5 常用注解栗子 Pre SpringBoot - 单元测试利器Mockito入门 SpringBoot - 应用程序测试方案 SpringBoot - SpringBootTest加速单元测试的小窍门 Spring Boot - Junit4 / Junit5 / Spring Boot / IDEA 关系梳理 package org.junit.jupit…

Excel VBA 变量,数据类型常量

几乎所有计算机程序中都使用变量&#xff0c;VBA 也不例外。 在过程开始时声明变量是一个好习惯。 这不是必需的&#xff0c;但有助于识别内容的性质&#xff08;文本&#xff0c;​​数据&#xff0c;数字等&#xff09; 在本教程中&#xff0c;您将学习- 一、VBA变量 变量是…

Unity中程序集dll

一&#xff1a;前言 一个程序集由一个或多个文件组成&#xff0c;通常为扩展名.exe和.dll的文件称为程序集&#xff0c;.exe是静态的程序集&#xff0c;可以在.net下直接运行加载&#xff0c;因为exe中有一个main函数(入口函数&#xff09;&#xff0c;.dll是动态链接库&#…

腾讯mini项目-【指标监控服务重构】2023-08-04

今日已办 关于 span-references 的调研 https://github.com/DataDog/dd-trace-js/issues/1761 https://github.com/open-telemetry/opentelemetry-specification/blob/874a451e7f6ac7fc54423ee3f03e5394197be35b/specification/compatibility/opentracing.md#span-references h…

基于springboot的OA人事办公管理系统

经典 oasys(OA自动化办公系统) 办公自动化&#xff08;OA&#xff09;是面向组织的日常运作和管理,员工及管理者使用频率最高的应用系统&#xff0c;极大提高公司的办公效率。 项目介绍 oasys是一个OA办公自动化系统&#xff0c;使用Maven进行项目管理。基于springboot框架开…

为什么要使用设计模式,以及使用设计模式的好处

在软件开发中&#xff0c;衡量软件质量只要包含如下指标&#xff1a; 正确性可维护性可读性可扩展性简洁性可测试性健壮性灵活性可复用性 然而&#xff0c;对于一些刚入行的新程序员来说&#xff0c;往往会注意不到上面这些问题&#xff0c;从而产生了一些让人头皮发麻的烂代…

谷粒商城----rabbitmq

一、 为什么要用 MQ? 三大好处&#xff0c;削峰&#xff0c;解耦&#xff0c;异步。 削峰 比如秒杀&#xff0c;或者高铁抢票&#xff0c;请求在某些时间点实在是太多了&#xff0c;服务器处理不过来&#xff0c;可以把请求放到 MQ 里面缓冲一下&#xff0c;把一秒内收到的…

Unity中Shader抓取屏幕并实现扭曲效果

文章目录 前言一、屏幕抓取&#xff0c;在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路&#xff1a;1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处&#xff0c;传入一个 float2 uv : TEXCOORD&#xff0c;用于之后对扭曲贴图进行采样3、…

写一篇nginx配置指南

nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件&#xff0c;该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织&#xff1a; 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…

计算机网络(二):TCP篇

文章目录 1. TCP头部包含哪些内容&#xff1f;2. 为什么需要 TCP 协议&#xff1f; TCP 工作在哪一层&#xff1f;3. 什么是 TCP &#xff1f;4. 什么是 TCP 连接&#xff1f;5. 如何唯一确定一个 TCP 连接呢&#xff1f;6. UDP头部大小是多少&#xff1f;包含哪些内容&#xf…

burp+IE 微信小程序抓包教程

文章目录 一、BURP里新增监听端口二、BURP导出证书三、导入证书四、IE代理设置五、小程序抓包实际测试 一、BURP里新增监听端口 找一个没用的端口&#xff0c;使用以下方式新增 二、BURP导出证书 选择刚才新增的监听端口&#xff0c;点击证书导入导出 将其存出来即可&…

安卓机型系统美化 Color.xml文件必备常识 自定义颜色资源

color.xml文件是Android工程中用来进行颜色资源管理的文件.可以在color.xml文件中通过<color>标签来定义颜色资源.我们在布局文件中、代码中、style定义中或者其他资源文件中&#xff0c;都可以引用之前在color.xml文件中定义的颜色资源。 将color.xml文件拷到res/value…

c++的库函数std::move() 与 完美转发函数 std:: forward 源码

以下是两个注释&#xff1a; &#xff08;2&#xff09;以下是一个实验&#xff1a;

esxi网卡直通后虚拟机无网

出现选网卡的时候无法选中&#xff0c;这里应该是一个bug。 解决方法如下&#xff1a; 1.先随便选择一个网卡 2.勾先取消再重新勾选 3.保存退出&#xff0c;重启虚拟机即可

浅谈一下前端字符编码

背景 众所周知&#xff0c;计算机只能识别二进制&#xff0c;它是由逻辑电路组成&#xff0c;逻辑电路通常只有两个状态&#xff0c;开关的接通与断开&#xff0c;这两种状态正好可以用二进制数的0和1表示。但是现实中存在着其他的字符&#xff1a;数字、字母、中文、特殊符号…