6.4遍历算法应用

C++图遍历算法的实现:深度优先与广度优先 🏆本文收录于「编程与技术实战」专栏,此专栏涵盖了C/C++编程、人工智能、数据结构、机器学习等技术领域的内容,助你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 阅读详情

6.4遍历算法应用

二叉树的遍历运算是一个重要的基础。一是重点理解访问根结点操作的含义,二 是注意对具体的实现时是否需要考虑遍历的次序选择要求

1.输出二叉树中的结点

【算法思想】
输出二叉树中的结点并无次序要求,因此可用三种遍历算法中的任何一种 完成,只需将访问操作具体变为输出操作即可。
下面给出采用先序遍历实现的算法。
【算法描述】

/* 先序遍历输出二叉树结点, root 为指向二叉树根结点的指针 */ 
{  
if (root!=NULL)  
{   
	printf (root ->data);       /* 输出根结点 */   
	PreOrder(root ->LChild);    /* 先序遍历左子树 */   
	PreOrder(root ->RChild);    /* 先序遍历右子树 */  
	} 
} 

2.输出二叉树中的叶子结点

【算法思想】
输出二叉树中的叶子结点与输出二叉树中的结点相比,它是一个有条件的输出问题,即在遍历过程中走到每一个结点时需进行测试,看是否满足叶子结 点的条件。
【算法描述】

void  PreOrder(BiTree root)  /* 先序遍历输出二叉树中的叶子结点 , root 为指向二叉树根结点的指针 */ 
{  
	if (root!=NULL)  
	{  
		if (root ->LChild==NULL && root ->RChild==NULL) 
		printf (root ->data);              /* 输出叶子结点 */   
		PreOrder(root ->LChild);               /* 先序遍历左子树 */   
		PreOrder(root ->RChild);               /* 先序遍历右子树 */  
	} 
}

3.统计叶子结点数目

方法一

【算法思想】
统计二叉树中的叶子结点数目并无次序要求,因此可用三种遍历算法中的 任何一种完成,只需将访问操作具体变为判断是否为叶子结点及统计操作即可。
下面给出采用后序遍历实现的算法。
【算法描述】

/* LeafCount 为保存叶子结点数目的全局变量,调用之前初始化值为 0 */ 
void leaf(BiTree root) 
{      
	if(root!=NULL)      
	{ 
		leaf(root->LChild); 
		leaf(root->RChild); 
		if (root ->LChild==NULL && root ->RChild==NULL) 
			LeafCount++;     
	} 
}
方法二

【算法思想】
给出求叶子点数目的递归定义:
1)如果是空树,返回 0;
2)如果只有一个结点,返回 1;
3)否则为左右子树的叶子结点数之和。

【算法描述】

int leaf(BiTree root) 
{ 
	int LeafCount;  
	if(root==NULL)    
		LeafCount =0;  
	else if ((root->LChild==NULL)&&(root->RChild==NULL))       
		LeafCount =1;  
	else  /* 叶子数为左右子树的叶子数目之和 */ 
		LeafCount =leaf(root->LChild)+leaf(root->RChild);   
	return  LeafCount; 
} 

4.建立二叉链表方式存储的二叉树

给定一棵二叉树,我们可以得到它的遍历序列;反过来,给定一棵二叉树的 遍历序列,我们也可以创建相应的二叉链表。这里所说的遍历序列是一种“扩展 的遍历序列”。在通常的遍历序列中,均忽略空子树,而 在扩展的遍历序列中,必须用特定的元素表示空子树。

例如,左图中二叉树的“扩展先序遍历序列”为: AB.DF…G…C.E.H…。
其中用小圆点表示空子树。
利用“扩展先序遍历序列” 创建二叉链表的算法如下:在这里插入图片描述
【算法思想】
采用类似先序遍历的递归算法,首先读入当前根结点 的数据,如果是“.”则将当前树根置为空,否则申请一个新结点,存入当前根 结点的数据,分别用当前根结点的左子域和右子域进行递归调用,创建左、右子树。
【算法描述】

void CreateBiTree(BiTree *bt) 
{ 
	char ch;   
	ch=getchar();   
	if(ch=='.') 
		*bt=NULL;   
	else 
	{ 
		*bt=(BiTree)malloc(sizeof(BiTNode));       
		(*bt)->data=ch;       
		CreateBiTree(&((*bt)->LChild));       
		CreateBiTree(&((*bt)->RChild));     
	} 
} 

5.求二叉树的高度

二叉树的高度(深度)为二叉树中结点层次的最大值,也可视为其左、右子 树高度的最大值加 1。
【算法思想】
二叉树 bt 高度的递归定义如下:

  • 若 bt 为空,则高度为 0。
  • 若 bt 非空,其高度应为其左、右子树高度的最大值加 1,如下图所示。
    在这里插入图片描述

【算法描述】

int PostTreeDepth(BiTree bt)   /* 后序遍历求二叉树 bt 高度 的递归算法 */ 
{   
	int hl, hr, max;   
	if(bt!=NULL)   
	{     
		hl=PostTreeDepth(bt->LChild);  /* 求左子树的深度 */     
		hr=PostTreeDepth(bt->RChild);  /* 求右子树的深度 */ 
		max=hl>hr?hl:hr;              /* 得到左、右子树深度较大者*/ 
		return(max+1);                /* 返回树的深度 */ 
	}  
	else 
		return(0);             /* 如果是空树,则返回 0 */ } 

求二叉树的高度是也可用前序遍历的方式实现

【算法思想】
二叉树的高度(深度)为二叉树中结点层次的最大值。设根结点为第一层的 结点,所有 h 层的结点的左、右孩子结点在 h+1 层。故可以通过遍历计算二叉树 中的每个结点的层次,其中最大值即为二叉树的高度。
【算法描述】

void PreTreeDepth(BiTeee bt, int h) /* 先序遍历求二叉树 bt 高度的递归算法,h 为 bt 指向结点所在层次,初值 为 1*/ /*depth 为当前求得的最大层次,为全局变量,调用前初值为 0 */ 
{   
	if(bt!=NULL)   
	{      
		if(h>depth)   
			depth = h;     /*如果该结点层次值大于 depth,更新 depth 的值*/      
		PreTreeDepth(bt->Lchild, h+1);  /* 遍历左子树 */      
		PreTreeDepth(bt->Rchild, h+1);  /* 遍历右子树 */   
	} 
} 

6.按树状打印二叉树

假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母。 要求实现二叉树的横向显示问题,如下图所示打印结果。
在这里插入图片描述

【算法思想】
(1)二叉树的横向显示应是二叉树竖向显示的 90。旋转。分析上图示可知, 这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为:CFEADB,这恰为逆中序顺序。解决二叉树的横 向显示问题采用“逆中序”遍历框架,所以横向显示二叉树算法为先右子树、再 根结点、再左子树的 RDL结构。

(2)在这种输出格式中,结点的左、右位置与结点的层深有关,故算法中 设置了一个表示当前根结点层深的参数,以控制输出结点的左、右位置,每当递归进层时层深参数加 1。这些操作应在访问根结点时实现。
【算法描述】

void PrintTree(BiTree bt, int nLayer)  /* 按竖向树状打印的二叉树 */ 
{   
	if(bt = =NULL) 
		return; 
	PrintTree(bt ->RChild,  nLayer+1); 
	for(int i=0; i<nLayer; i++) 
		printf(" ");           
	printf(“%c\n”, bt ->data);   /*按逆中序输出结点,用层深决定的左、右位置*/ 
	PrintTree(bt ->LChild ,  nLayer+1); 
} 
C++ 补充之常用遍历算法 通过transform算法,可以方便地对容器中的每个元素进行转换操作,并将结果存储在另一个容器中,减少了显式循环的编写。通过for_each算法,可以方便地对容器中的每个元素进行操作,而不需要显式地编写循环。transform算法用于对序列中的每个元素应用指定的操作,并将结果存储在另一个序列中。find算法用于在容器中查找指定值第一次出现的位置,返回指向第一个等于该值的元素的迭代器,若未找到,则返回迭代器指向容器的末尾。通过使用这些算法,可以方便地对容器中的元素进行各种不同的操作和处理。 阅读详情

相关推荐

二叉树的4种遍历算法

遍历二叉树可以算作是对树存储结构做的最多的操作,既是重点,也是难点。本节将从初学者的角度给大家分析一下 4 种遍历二叉树算法的由来。

数据结构和算法教程(C语言版) 1235

5个常用的遍历算法

for_each #pragma once #include <iostream> #include <vector> #include <algorithm> #include <functional> using namespace std; void printfs(int val) { cout << val << endl; } void test01() { vector<int> v; v.push_

Bk冗余 1181

二维数组螺旋遍历算法实现

螺旋遍历是一种在二维数组或矩阵上按照螺旋形状顺序访问元素的方法。从外围开始,逐步向内收缩,直到访问完所有元素。其核心在于沿着外围边界依次向内缩小范围,同时改变遍历方向。在螺旋遍历中,通常有以下四个方向的变化:从左向右、从上向下、从右向左、从下向上。这个过程需要交替进行,直到达到数组的中心位置。特点:连续性:在遍历过程中,每次改变方向都是连续的,不会跳跃任何元素。方向性:每一层的遍历方向相对固定,由外向内逐步变化。周期性。

weixin_35294091的博客 1133

以二叉链表存储的二叉树中,每个结点所含数据元素均为单单字母,按树状打印二叉树的算法。

观察序列 可以发现树状序列 等于 中序遍历的 逆序, 实际实现 中序遍历的逆序 /* 以二叉链表存储的二叉树中,每个结点所含数据元素均为单单字母,按树状打印二叉树的算法。 */ //观察序列 可以发现树状序列 等于 中序遍历的 逆序, 实际实现 中序遍历的逆序 #include "stdio.h"//包含 getchar() scanf() printf() #include "malloc.h"//malloc()动态申请空间 函数 //二叉树 结点 struct node{ ch.

qq_47991812的博客 1801

二叉树遍历算法的应用

课程设计文档 利用二叉树遍历算法的框架和思路,假设访问结点的具体操作不仅仅局限于输出结点数据域的值,而把访问延伸到对结点的判别、计数等其他操作。这样可以解决一些关于二叉树的其他实际问题。(1) 统计二叉树中结点总数m,叶子结点个数n0 (2) 求二叉树的树深

不用写代码!用AIStarter 5.0.0离线包部署InfiniteTalk的完整指南(Windows/Mac/Linux全平台)

本文详细介绍了如何使用AIStarter 5.0.0离线包在Windows、Mac和Linux平台上零代码部署InfiniteTalk数字人。从环境准备、离线资源获取与验证,到全平台部署实操指南,提供了完整的本地化安装流程和优化建议,帮助用户快速实现AI项目的一键部署。

weixin_30275415的博客 273

java横向打印二叉树_按树状横向打印二叉树

问题假设以二叉链表存储的二叉树中,每个结点所含数据元素均为单字母。 要求实 现二叉树的横向显示问题,如下图所示打印结果。问题分析(1) 二叉树的横向显示应是二叉树竖向显示的90°旋转。分析上图可知,这种树形打印格式要求先打印右子树,再打印根,最后打印左子树,按由上而下顺序看,其输出的结点序列为:CFEADB,这恰为逆中序遍历。所以横向显示二叉树的算法为先右子树、再跟结点、再左子树的RDL结构。(2...

weixin_42510768的博客 582

5G协议栈逆向工程:基于开源模拟器的核心网信令分析实战

本文详细介绍了基于开源模拟器Free5GC和UERANSIM的5G协议栈逆向工程实战,涵盖核心网信令分析、环境搭建、认证协议解析及安全漏洞验证。通过NGAP/NAS信令交互解密和异常流量注入测试,帮助研究人员深入理解5G网络安全机制,并提供实用的安全加固建议。

weixin_29250573的博客 675

深度遍历算法详细解释及例题应用

前言 生若夏花,死如秋叶 本小节知识目录 深度遍历算法原理及图解 深度遍历算法例题应用 1:全排列问题 2:ABC+DEF=GHI问题 3:二维数组寻找点到点的最短路径 4:求岛屿的面积 5:求岛屿的个数 6:地板的埔法有多少种 7:二叉树的深度遍历 8:图的深度遍历 9:图的最短路径求解 10:找子集等于某给定的数 正题开始 1:深度遍历算法原理及图解 1:深度遍历算法理论 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分

qq_40314362的博客 8027

GoPro官方API实战:从蓝牙配对到Wi-Fi流媒体,构建跨平台控制应用

本文详细解析了GoPro官方API的开发实践,涵盖蓝牙配对、Wi-Fi流媒体控制等关键技术。通过实战案例,指导开发者如何构建跨平台控制应用,解决设备发现、指令解析、视频流传输等核心问题,并分享Android平台迁移经验与常见问题排查方法。

weixin_30727835的博客 397

利用李雅普诺夫函数开发航天器姿态控制系统

本文基于李雅普诺夫函数控制方法,采用修正罗德里格斯参数(MRP)描述航天器姿态,设计了姿态控制律。通过构造能量型李雅普诺夫函数,推导出保证系统稳定的控制闭环方程,实现了航天器从初始状态到目标状态的稳定转换。针对MRP参数可能出现的奇异性问题,采用影子集进行规避。仿真实验包含两种模式:非追踪模式(目标状态为0)和追踪模式(目标为三角函数轨迹)。结果表明,该控制方法能够有效实现姿态稳定和轨迹跟踪,在短暂调整后即可精确跟随目标轨迹。控制律设计考虑了不同参考系间的转换,通过DCM矩阵处理目标角速度的坐标变换问题。

weixin_50227659的博客 1221

017-二叉树的遍历算法

二叉树遍历算法摘要 本文系统介绍了二叉树的遍历算法,包括前序、中序、后序和层序遍历。主要内容有: 遍历概述:二叉树遍历是按照特定顺序访问所有节点的过程,分为深度优先(前序、中序、后序)和广度优先(层序)两类。 遍历实现:详细讲解了递归和非递归两种实现方式,其中非递归实现使用栈结构模拟递归调用。 遍历特点:前序遍历适合复制树结构,中序遍历对二叉搜索树可得到有序序列,后序遍历常用于释放树内存。 代码示例:提供了Python实现代码,包括节点定义、树结构创建和四种遍历算法的具体实现,并附有详细的执行过程说明。 应

wyl703的博客 2138

基于STM32L4XX、HAL库的MCP4561数字电位器驱动程序设计

/ HAL库需要左移一位。* @param address: 设备地址(0x2C-0x2F)* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hmcp: MCP4561句柄。* @param hi2c: I2C句柄。

zhusl6688的博客 340

C++ 遍历算法

在C++中,transform是一个标准库函数,用于将一个序列的元素进行转换。它通常有三个参数:📖1.输入序列的起始位置(iterator)📖2.输入序列的结束位置(iterator)📖3.输出序列的起始位置(iterator)此外,它通常还有一个可选的第四个参数,即用于转换的函数,该函数接受一个输入元素并返回一个输出元素。所以,📖其中,inputBegin和inputEnd是指输入序列的起始和结束位置;outputBegin是指输出序列的起始位置;

fckbb的博客 2087

自定义配方画面的具体方法示例 - 嵌入式

自定义配方画面的具体方法示例 - 嵌入式在TIA博途WinCC中,您可以通过编程来创建自定义配方画面。这些画面可以用于显示和编辑您的嵌入式系统中的配方参数。下面是一个示例,展示了如何在WinCC中实现自定义配方画面的方法。首先,您需要创建一个新的画面,并添加必要的控件来显示和编辑配方参数。在WinCC中,您可以使用文本框、按钮和标签等控件来实现这一目的。以下是一个简单的示例,展示了如何创建一个具有文本框和按钮的配方画面:创建新画面:添加控件:编辑控件属性:编写脚本: 在这个示例中,我们定义了两个变量和来存储

CyberBytezZ的博客 1035

3D视觉实战之双目相机物体尺寸实时测量

视差图滤波能够将稀疏视差转变为稠密视差,并在一定程度上降低视差图噪声,改善视差图的视觉效果,但是比较依赖初始视差图的质量。的目标是获得左右两个相机的内参、外参和畸变系数,其中内参包括左右相机的fx,fy,cx,cy,外参包括左相机相对于右相机的旋转矩阵和平移向量,畸变系数包括径向畸变系数(k1, k2,k3)和切向畸变系数(p1,p2)以及其他一些畸变类型。:相比于昂贵的专业设备,便宜的双目摄像头可以显著降低成本,使得实时点云生成技术更加普及和经济实惠。

qq_53545309的博客 2099

C++实现图的深度优先遍历算法完整代码

要遍历的图如上图所示 采用邻接表实现 #include <iostream> using namespace std; #include<stdlib.h> # define maxSize 10 typedef struct ArcNode{ //边表结点 int adjvex; //是这条边所指向的下一个结点的数组下标 struct ArcNode *nextarc; //int info; //如果有权值就使用 }ArcNode; typedef str

weixin_45482422的博客 5948

【AutoCAD中实现双击文本编辑功能】

例如:以下是官方博客例子浅析先加入相关的头文件和库文件。在AutoCAD中有一个很重要的功能,就是双击图形尺寸或文本后会出现一个文本编辑框,用户可在该编辑框中修改文字。本文介绍了如何使用AcEdInplaceTextEditor来实现该功能。实现cad的消息监听。创建一个消息监听的类并在cad中注册来实现消息监听。主要是监听键盘输入。提示:以下是本篇文章正文内容,下面案例可供参考提示:这里对文章进行总结:例如:以上就是今天要讲的内容,本文仅仅简单介绍了的函数和方法。

我的博客 1149

Python算法系列—深度优先遍历算法【二叉树】

深度优先遍历算法之二叉树一、什么是深度优先遍历二、二叉树1. 二叉树简介2.二叉树类型3.二叉树相关术语4. 二叉树的节点代码5. 二叉树遍历顺序6.深度优先遍历和广度优先遍历三、面试题+励志 ``这不就是二叉树吗?嗯,风景都在提示我该学学二叉树了``` 一、什么是深度优先遍历 深度优先遍历算法是经典的图论算法。从某个节点v出发开始进行搜索。不断搜索直到该节点所有的边都被遍历完,当节点v所有的边...

TianYao 7922

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

二叉树的四种遍历算法

二叉树作为一种重要的数据结构,它的很多算法的思想在很多地方都用到了,比如STL算法模板,里面的优先队列、集合等等都用到了二叉树里面的思想,先从二叉树的遍历开始: 看二叉树长什么样子: 我们可以看到这颗二叉树一共有七个节点 0号节点是根节点 1号节点和2号节点是0号节点的子节点,1号节点为0号节点的左子节点,2号节点为0号节点的右子节点 同时1号节点和2号节点又是3号节点、四号节点和五号节点、6号节点的双亲节点 五号节点和6号节点没有子节点(子树),那么他们被称为‘叶子节点’ 这就是一些基本

bobozai86的博客 1万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

数据结构——二叉树的递归遍历算法与非递归遍历算法+层次遍历算法

数据结构中二叉树的递归与非递归遍历算法(先序、中序、后序)+层次遍历算法分析与实现。 数据结构二叉树的遍历算法!!!

mcr1379673758的博客 4856

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

树的遍历算法

树的遍历算法Python实现

medouyoulo的博客 4076

无向连通图的广度优先遍历算法

图的广度优先算法是图的基本算法,也是最小生成树以及单源最短路径算法的基础。最近把广度优先遍历算法实现了一下,希望能够有比以前更深的体会或者加强一下对该算法的理解。前些天看了优米网上关于于丹做客在路上的一段视频,有一点心得体会。我很赞同于丹的观点,一个人的见识是十分重要的,所谓见识,从某一方面来理解,那就是要亲历亲为。对于算法这一门数学与编程并重的学科更是如此。     任何一种算法,都需要搞清楚

wolenski的专栏 5282

JavaScript的数组遍历算法题

在Web前端开发中,JavaScript作为核心语言之一,其数组操作是面试和实际项目中频繁考察的知识点。在日常开发中,灵活运用这些方法,不仅可以提升代码质量,还能显著提高开发效率。希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。在JavaScript中,数组遍历可以通过多种方式实现,例如传统的。一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身农奴把歌唱,这是一个经典的数组遍历问题,要求计算数组中所有数字的总和。

一个做过前端开发的产品经理,经历过睿智产品的折磨导致脱发之后,励志要翻身"农奴"把歌唱,一边打入敌人内部一边持续提升自己,为我们广大开发同胞谋福祉,坚决抵制睿智产品折磨我们码农兄弟! 1349
上一篇: 6.3二叉树的遍历
下一篇: 6.5二叉树遍历算法基于栈的递归消除
亓木Wilson
博客等级 码龄7年 51粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值