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

news2024/10/1 20:32:36

我们知道数据的存储结构分为线性与非线性。线性就是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.coloradmin.cn/o/1024881.html

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

相关文章

iOS 17 Simulator Failed with HTTP status 400:bad request

升级 xcode 15 要 ios17 的 sdk 才能运行&#xff0c;但是更新这个 sdk 400 错误了 解决方案&#xff1a; 直接去官网下载开发者后台下载dmg文件&#xff0c;使用命令行快速安装即可 https://developer.apple.com/documentation/xcode/installing-additional-simulator-runti…

Anaconda和Pycharm详细安装 配置教程

Anaconda&#xff1a;是一个开源的Python发行版本&#xff0c;其中包含了conda、Python等180多个科学包及其依赖项。【Anaconda下载】 PyCharm&#xff1a;PyCharm是一种Python IDE&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。【PyCharm下载】…

功能强大的PostgreSQL没有MySQL流行的10个原因,你知道几个?

以下内容是根据玖章算术CEO叶正盛在「3306π 数据库朋友圈」技术演讲整理。文末附完整的PPT下载链接&#xff01; MySQL与PostgreSQL都是非常优秀并且非常成功的数据库&#xff0c;PostgreSQL的功能比MySQL强大&#xff0c;但是依然没有MySQL流行&#xff0c;作者从产品功能、…

Vue3中的computed函数详解

计算属性是Vue中常用的一种方式&#xff0c;主要用于在模板中放置逻辑计算&#xff0c;方便开发者进行数据操作和展示。在Vue3中&#xff0c;计算属性依然是非常重要的一种功能&#xff0c;而computed函数则更加的方便计算属性的使用。本文将对Vue3中的computed函数进行详细的介…

terraform简单的开始-vpc cvm创建

从网络开始 从创建VPC开始 复用前面的main.tf的代码&#xff1a; terraform {required_providers {tencentcloud {source "tencentcloudstack/tencentcloud"version "1.81.25"}} } variable "region" {description "腾讯云地域"…

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(二)

西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(二) 上一次和大家分享了组态相关的重要内容,具体可以参考以下链接中的内容: 西门子S7-1200F或1500F系列安全PLC的组态步骤和基础编程(一) 本次继续和大家分享关于安全PLC基础编程的相关内容: 如下图所示,在左侧的…

开通经营收款码要手续费吗

我们都知道&#xff0c;目前市场上的支付宝或者微信商户收款&#xff0c;无论是线上收款还是实体店收款&#xff0c;一般都采用0.6%的收款费率&#xff0c;1万元就是60元。 其实这不低的。 大多数线下实体店商家可能使用的聚合支付码可能是0.38%&#xff0c;1万元是38。 虽然不…

21天学会C++:Day12----初始化列表

CSDN的uu们&#xff0c;大家好。这里是C入门的第十一讲。 座右铭&#xff1a;前路坎坷&#xff0c;披荆斩棘&#xff0c;扶摇直上。 博客主页&#xff1a; 姬如祎 收录专栏&#xff1a;C专题 目录 1. 初始化列表 1.1 引入 1.2 初始化列表 1.3 初始化列表的注意事项 1.…

字符集(ASCII、GBK、Unicode、UTF-8)

1、字符集基础知识 计算机底层不可以直接存储字符的。计算机中底层只能存储二进制&#xff08;0、1&#xff09;二进制是可以转换成十进制的结论&#xff1a;计算机底层可以表示十进制编号。计算机可以给人类字符进行编号存储&#xff0c;这套编号规则就是字符集。 2、ASCII字符…

如何像微信一样扫码自由?

https://github.com/devilsen/CZXing 我在使用zxing的总是想扫码的时候怎么才能够快速校准&#xff0c;多个二维码扫描的时候怎么才能指定二维码呢。于是我在Github上找到了CZxing这个控件。在使用的时候发现了有些小问题。 扫码结果没有回调。 回调没有反应&#xff1b;是因…

二维码智慧门牌管理系统:提升城市管理效率与服务水平

文章目录 前言一、系统原理及特点二、系统的优势与应用 前言 在当今快速发展的信息化时代&#xff0c;如何有效地管理城市地址信息成为了各大城市面临的重要问题。传统的门牌管理系统已经无法满足现代城市的需求&#xff0c;而二维码智慧门牌管理系统作为全新的解决方案&#…

数据库开发-MySQL

数据库设计-DDL 下面我们就正式的进入到SQL语句的学习&#xff0c;在学习之前先给大家介绍一下我们要开发一个项目&#xff0c;整个开发流程是什么样的&#xff0c;以及在流程当中哪些环节会涉及到数据库。 项目开发流程 需求文档&#xff1a; 在我们开发一个项目或者项目当中…

Linux文件内容显示练习

1.新建2个文件b1.txt b2.txt ,使用vim打开b1.txt 输入“Hello World”字符串,将b1.txt硬链接到b2.txt 查看2个文件的硬连接数 [rootserver ~]# vim b1.txt [rootserver ~]# ln b1.txt b2.txt #建立硬链接 [rootserver ~]# stat b2.txt [rootserver ~]# stat b1.txt [r…

现货黄金的价格如何变动

现货黄金每天的交易时间很长&#xff0c;价格几乎全天24小时都处于波动之中&#xff0c;由于受到各种政治、经济因素的影响&#xff0c;价格波动有时可以来得十分迅猛&#xff0c;在一小时就可以波动二、三十美元&#xff0c;但有时却可以连续几天都维持在数美元的区间内波动。…

《使用 sCrypt 构建井字游戏》课程上线

《使用 sCrypt 构建井字游戏》课程上线 Learn sCrypt。Learn sCrypt 是一个交互式学习网站&#xff0c;旨在帮助开发者更快、更轻松地学习和掌握比特币智能合约开发语言 sCrypt。 井字游戏非常简单&#xff0c;就是使用两个玩家(分别是 Alice 和 Bob)的比特币地址初始化合约&a…

Spring框架——介绍与基本概念!

一、Spring框架概述 1.什么是Spring Spring是一个轻量级的Java 开发开源框架&#xff0c;用于构建企业级应用程序。它提供了一组广泛使用的技术和API&#xff0c;包括依赖注入、AOP、数据访问、事务管理、Web开发和集成测试等。它是为了解决企业应用开发的复杂性而创建的。框…

c盘中temp可以删除吗?appdata\local\temp可以删除吗?

http://www.win10d.com/jiaocheng/22594.html C盘AppData文件夹是一个系统文件夹&#xff0c;里面存储着临时文件&#xff0c;各种应用的自定义设置&#xff0c;快速启动文件等。近期有用户发现appdata\local\temp占用了大量的空间&#xff0c;那么该文件可以删除吗&#xff1f…

Java 21 发布,带来诸多新特性又一次创新的飞跃

一、引言 2023年9月19日&#xff0c;Oracle公司正式发布了JDK 21&#xff0c;这是按照六个月发布周期准时交付的第12个功能版本。 这种可预测性让开发者能够轻松地管理他们对创新的采用&#xff0c;感谢稳定的改进流。JDK 21不仅包含了数千个性能、稳定性和安全性更新&#xf…

比特币上的可验证延迟函数

可验证延迟函数 (VDF) 是一种需要大量 顺序计算 来评估但可以快速验证的函数。我们首次在比特币上实现了它。VDF 作为密码学技术可用于构建大量新应用程序&#xff0c;例如公共随机信标、计算时间戳和数据复制证明。 VDF 场景 链上随机信标 在区块链中很难实现随机性&#xf…

php生成二维码合成文字、背景图并保存本地图片

目录 1、实现效果&#xff0c;二维码二维码合成文字、背景图 2、下载并引入qrcode 3、创建static文件夹下载字体和背景图到这 4、创建test2.php&#xff0c;合成代码 1、实现效果&#xff0c;二维码二维码合成文字、背景图 2、下载并引入qrcode 1、到phpqrcpde官网下载类库…