二叉树宽度高度相关算法题|非递归求二叉树高度|求非空二叉树宽度(C)

6-1 求二叉树高度 (25 分)【实验三:二叉树的构造和遍历】 6-1 求二叉树高度 (25 分) 本题要求给定二叉树的高度。 函数接口定义: int GetHeight( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 要求函数返回给定二叉树BT的高度值。 裁判测试程序样例 阅读详情

非递归求二叉树高度

假设二叉树采用二叉链表存储结构,设计一个非递归算法求二叉树的高度

算法思想

采用层次遍历的算法,设置遍历level记录当前节点所在的层数,设置变量last指向当前层的最右节点,每次层次遍历出队时与last指针比较,若两者相等,则层数+1,并让last指向下一层的最右节点,直到遍历完成。level的值即为二叉树的高度

如果是空树,高度为0,返回0
初始化front和rear数组队列下标指针
初始化last指向队列中的最右节点,level表示层数
创建一个数组,数据类型是二叉树节点,大小是MaxSize
![[Pasted image 20241119090953.png]]

front和rear初始化为-1,表示队列为空,
rear指向队尾最后一个节点,front指向队头节第一个节点的前一个位置
将根节点入队,先++rear,再把T赋值进去
![[Pasted image 20241119091118.png]]

创建一个工作指针cur访问节点
队列元素出队,即++front,用cur指向出队元素
![[Pasted image 20241119093141.png]]

将当前节点的左孩子右孩子入队
![[Pasted image 20241119093412.png]]

当前front是0,last也是0,front指向的是上一层的最右节点A,last初始化为0,也就是指向A,表示是最右节点,
层数level+1
因为是层序遍历,所以rear指向的就是当前层的最右节点
last指向rear,也就是下一层,指向C
然后继续出队遍历,
![[Pasted image 20241119094158.png]]

front指向的出队元素B不是最右元素,继续出队
![[Pasted image 20241119094215.png]]

front等于last,level++,last指向rear也就是E
继续出队
![[Pasted image 20241119094302.png]]

出到E,front等于last,level++

int BTdepth(BTNode* T)
{
	if (!T)
		// 树空,高度为0
		return 0;

	int front = -1, rear = -1;
	// last指向当前层的最右节点
	int last = 0, level = 0;
	// 设置队列Q,元素是二叉树节点指针且容量足够
	BTNode Q[MaxSize];
	// 将根节点入队
	Q[++rear] = T;
	BTNode* cur;
	// 队不空则循环
	while (front < rear)
	{
		// 队列元素出队,即正在访问的节点
		cur = Q[++front];
		if (cur->left)
			// 左孩子入队
			Q[++rear] = cur->left;
		if (cur->right)
			// 右孩子入队
			Q[++rear] = cur->right;
		// 处理该层的最右节点
		if (front == last)
		{
			// 层数加1
			level++;
			// last指向下一层
			last = rear;
		}
	}
	return level;
}

求非空二叉树宽度

假设二叉树采用二叉链表存储结构,设计一个算法,求非空二叉树b的宽度(即具有节点数最多的那一层的节点个数)

算法思想

采用层次遍历的方法求出所有节点的层次,并将所有节点和对应的层次放在一个队列中
然后通过扫描队列求出各层的节点总数,最大的层节点总数即为二叉树的宽度
![[Pasted image 20241119135323.png]]

rear++,根节点入队,指针赋给data里的rear下标的位置,层次赋给level里的rear下标的位置
![[Pasted image 20241119135445.png]]

出队,front++,把出队节点,也就是data和level的front下标位置的数据读出来,保存到cur和lv
把左右孩子读进去,把节点和层次也存到相应位置,
![[Pasted image 20241119140153.png]]

![[Pasted image 20241119140933.png]]

直到队空循环结束
![[Pasted image 20241119141018.png]]

用i遍历整个队列
![[Pasted image 20241119141331.png]]

用n统计第lv层的节点个数
lv初始化为1,也就是查找第一层的节点,也就是level数组,如果level的i下标的值等于level表示有一个节点,n++
走完之后,lv等于最后一次i++的下标位置的值,也就是2
![[Pasted image 20241119141356.png]]

然后再开始一轮,
最后max=2

typedef struct
{
	// 保存队列中的节点指针
	BTNode* data[MaxSize];
	// 保存data中相同下标节点的层次
	int level[MaxSize];
	int front, rear;
}Que;

int BTWidth(BTNode* T)
{
	BTNode* = cur;
	int lv, max, i, n;
	// front=rear=-1,队列为空
	Que.front = Que.rear = -1;
	// 根节点入队
	Que.rear++;
	Que.data[Que.rear] = T;
	// 根节点层次为1
	Que.level[Que.rear] = 1;
	// 当队列不为空
	while (Que.front < Que.rear)
	{
		// 出队
		Que.front++;
		// 读取出队节点
		cur = Que.data[Que.front];
		// 保存出队节点的层次
		lv = Que.level[Que.front];
		// 左孩子进队列
		if (cur->left)
		{
			Que.rear++;
			// 进保存指针的数组
			Que.data[Que.rear] = cur->left;
			// 进保存层次的数组
			Que.level[Que.rear] = lv + 1;
		}
		// 右孩子进队列
		if (cur->right)
		{
			Que.rear++;
			Que.data[Que.rear] = cur->right;
			Que.level[Que.rear] = lv + 1;
		}
	}
	// max保存同一层最多的节点个数
	max = 0;
	i = 0;
	// lv表示从第一层开始找
	lv = 1;
	// i扫描队中的所有元素
	while (i <= Que.rear)
	{
		// n统计第lv层的节点个数
		n = 0;
		while (i <= Que.rear && Que.level[i] == lv)
		{
			n++;
			i++;
		}
		lv = Que.level[i];
		// 保存最大的n
		if (n > max)
			max = n;
	}
	return max;
}
算法学习19-实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式及深搜和宽搜 算法学习19-实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式及深搜和宽搜 文章目录算法学习19-实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式及深搜和宽搜实现二叉树的先序、中序、后序遍历相关知识递归行为非递归行为实现树的深度实现树的宽度总结实现二叉树的先序、中序、后序遍历,包括递归方式实现二叉树的先序、中序、后序遍历,包括递归方式和非递归方式 实现二叉树的先序、中序、后序遍... 阅读详情

相关推荐

数据结构:二叉树详解 c++信息学奥赛基础知识讲解

​ 一、二叉树的定义 二叉树(Binary Tree) 是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树T TT: 有且仅有一个根结点; 除根结点外的其余结点又可分为两个不相交的子集TL和TR,分别称为T的左子树和右子树,且TL和TR本身又都是二叉树。 很明显该定义属于递归定义,所以有关二叉树的操作使用递归往往更容易理解和实现。 从定义也可以看出二叉树与一般树的区别主要是两点,一是每个结点的度最多为2;二是结点的子树有左右之分,不能随意调换,调换后又是一棵新的二叉树。

青少年编程学习指导 2616

先序输出叶结点

本题要求按照先序遍历的顺序输出给定二叉树的叶结点。 函数接口定义: void PreorderPrintLeaves( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; typedef Position BinTree; struct TNode{ ElementType Data; BinTree Left; BinTree Right; }; 函数PreorderPrintLeaves应按照先序遍历的

Self-den1al的博客 2230

使用sklearn学习多项式回归(三)

1,什么是线性 我们无数次提到”线性“这个名词。在支持向量机中,我们也曾经提到最初的支持向量机只能够分割线性可分的数据,然后引入了”核函数“来帮助我们分类那些非线性可分的数据。我们也曾经说起过,比如说决策树,支持向量机是”非线性“模型。所有的这些概念,让我们对”线性“这个词非常熟悉,却又非常陌生——因为我们并不知道它的真实含义。接下来我们看看线性回归模型改进的核心之一:帮助线性回归解决非线性问题。 1.1,变量之间的线性关系 ”线性“这个词用于描述不同事物时有着不同的含义。我们最常使用的线性是指“变量

理科男同学 5100

6-4 二叉树的非递归遍历 (25 分)

本题要求用非递归的方法实现对给定二叉树的 3 种遍历。 函数接口定义: void InorderTraversal( BinTree BT ); void PreorderTraversal( BinTree BT ); void PostorderTraversal( BinTree BT ); 其中BinTree结构定义如下: typedef struct TNode *Position; t...

xixi0209的博客 6544

WPS制作甘特图实操(带图超详细)

一、数据准备 图1 二、添加公式 在表格的E3处添加公式:=IF(C3>=G3,0,IF(C3+D3>=G3,G3-C3,D3)),点击该单元格的右下角。使鼠标箭头变“+”后下拉拖拽,复制该公式。F3处的公式为:=D3-E3,使用相同的拖拽方式复制公式应用,操作完毕如下图3. 图2 图3 三、插入图表 1、选中方框1内容,按住ctrl按键,继续选择2、3列的内容,点击插入全部图表中的条形图,选择2对应的图标样式,生成图6的样式。 点击图6中的3标尺,右击选择数据弹出图8,点击+号选择表格中

m0_49047167的博客 3万+

STM32中断实战:用ITR9606红外传感器DIY转速计数器(附完整代码)

本文详细介绍了如何使用STM32中断机制和ITR9606红外传感器DIY高精度转速计数器。从传感器选型、中断配置到抗干扰设计,提供完整的实战指南和优化代码,特别适合嵌入式开发者和硬件工程师快速实现工业级转速检测系统。

weixin_29159613的博客 288

二叉树遍历-知二定一

根据中序遍历中左右子树的元素数量,在后序遍历 DGEBHIFCA 中找到对应的左右子树。左子树的后序遍历是 DGEB ,右子树的后序遍历是 HIFC。在中序遍历 DBGEACHFI 中找到 A ,那么 A 左边的 DBGE 是左子树的中序遍历, CHFI 是右子树的中序遍历。给出一棵二叉树的中序遍历:DBGEACHFI 与后序遍历:DGEBHIFCA ,确定此二叉树的前序遍历。在中序遍历 DBGE 中找到 B ,那么 D 是 B 的左子树, GE 是 B 的右子树。因此, A 是这棵树的根节点。

矿枝 2174

PCout(n) -- STM32F103RCT6 位带操作

位带操作,sys.h,PCout,PAout,PAout

weixin_50212044的博客 4021

编程练习题目集【目录】

所有负面情绪都源于你的弱小,唯有强大自己才能够百毒不侵。

绯樱殇雪的博客 1171

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4331

excel wind插件使用_Python和wind的交互—在债券中的应用

个人认为学会了怎么用python和wind交互以及怎么用python处理Excel数据,就基本能替换日常很多琐碎的债券工作,还不用担心Excel某个值改变了导致整个报表都毁了。事实上在python调用wind函数和在Excel中调用函数一样简单,只要会基本的操作就够了。下面详细的介绍如何用python和wind进行交互。首先安装好python+pycharm+wind。因为python...

weixin_39863918的博客 5329

二叉树相关代码题【较全】C语言

树的相关代码题 递归非递归、求高度、判断是否完全二叉树、相似二叉树、以及孩子兄弟表示法的相关例题求解

qq_42338744的博客 3297

PyTorch生成式人工智能(25)——基于Transformer实现机器翻译

不同于循环神经网络 (RNN) 按顺序处理数据,Transformer 以并行的方式处理输入数据(例如句子)。这种并行处理提高了效率,但并未使其能够识别输入的顺序。为了解决这个问题,Transformer 向输入的词嵌入中添加了位置编码。这些位置编码是分配给输入序列中每个位置的独特向量,其维度与输入词嵌入对齐。本节将以英语到法语的翻译为例,通过介绍如何训练 Transformer 模型将英语句子转换为法语,深入理解 Transformer 的架构及自注意力机制的运作方式。

盼小辉丶的博客 2722

非递归算法实现二叉树高度

思路: 嘻嘻,请读者自己手动模拟。博主这里不知道怎么说。 拓展: 该算法思路也适用于 (1)每层的结点个数 (2)树的最大宽度 (3)节点位于某一层 int height(BiTree T){ if(T==null) return 0; int front=-1, rear=-1;//front 出队指针 rear 入队指针 int last = 0, level=0;/...

469

《Python全栈系列教程》专栏介绍及文章汇总

《Python全栈系列教程》专栏介绍及文章汇总

孤寒者的博客 71万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

二叉树的概念及面试题大全

1. 二叉树(Binary Tree)的定义 1.1 什么是二叉树(Binary Tree) 每个结点至多拥有两棵子树的树结构(即二叉树中不存在度大于2的结点)。并且,二叉树的子树有左右之分,其次序不能任意颠倒。 上面概念中提到了“度”的概念,“度”其实就是某个节点子节点的数量。如果某个节点的子节点数量为1,则该节点的度为1,如果有8个子节点,则度为8,以此类推。 1.2 二叉树的术语 除了二...

shuningzhang的专栏 526

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

刷题——二叉树C++

a+b //根结点层数为1,不加左右括号。先序遍历序列中第4个结点的值为。树的高度为(非递归):4。树的高度为(递归):4。

weixin_50942741的博客 222

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

25考研计算机机试复试-树与二叉树相关习题实现(C语言)

前序非递归,借助栈实现(一般而言递归算法都可转换为借助栈实现的非递归算法,递归算法使用的是系统栈)后序非递归,这个会稍微麻烦一点,但是必须掌握,有部分算法题利用后序非递归的特性可以很方便的解决。注意删除某个子树时要后序删除,也就是先删除根的孩子,再删除根本身,这样不会导致断链。(递归前中后、非递归前中后、层次遍历) 深度优先遍历。利用层次遍历的特点,一层层出队,每出完一层高度就+1。2.二叉树的非递归形式遍历(前中后) 必须掌握!递归形式的遍历是最简单的也是最基本的,必须掌握。思路:后序非递归遍历。

2301_76580227的博客 450

二叉树(二) 求二叉树高度,根据先序和中序构建二叉树,判断二叉树是否是完全二叉树,判断两棵树是否相等

根据上一篇二叉树的各种遍历方法,本篇文章进一步写出二叉树相关操作函数代码。 1、求二叉树高度 递归求解: /*递归求二叉树高度*/ int Btdeep(BiTree T){ if(T == NULL) return 0; int ldeep = Btdeep(T->lchild); int rdeep = Btdeep(T->rchild);

话歪之地的博客 863

二叉树高度计算:从递归到迭代的算法精解与工程实践

在数据结构与算法领域,二叉树是一种基础且重要的非线性数据结构,其高度(或深度)是衡量树形结构复杂度和平衡性的核心指标。理解二叉树高度的计算原理,关键在于掌握深度优先遍历,尤其是后序遍历的运用,其‘先左后右最后根’的访问顺序,完美契合了需要先获取子树高度再计算当前节点高度的逻辑。从技术价值看,高效计算树高不仅是评估二叉树性能(如搜索效率)的基础,更是实现平衡二叉树(如AVL树、红黑树)和维护其平衡因子的前提。在实际应用场景中,无论是数据库索引优化、文件系统目录结构管理,还是编译器语法树分析,对树高的快速获取都

weixin_33860528的博客 347

二叉树(附带一点森林的代码)

常考的二叉树的相关题目(部分题目会考但未整理)

weixin_52323547的博客 1182

c语言判断一个已知的二叉树是否是二叉排序树_leetcode题目整理——树

北极有一棵椰子树 左子树是椰子树 右子树也是椰子树 在去北极尸位出道的路上,我们聊聊树。树这个话题,可以很宽泛,比如前缀树 回溯 搜索树 union-find这些问题都包含树,为了不显得那么话唠这些我们以后再说。今天就聊一聊看起来像北极椰子树的树。 说起来,只要能理解递归分治 ,外加对先序遍历中序遍历后序遍历层序遍历有点熟练度,这些问题都不是很难。 基本操作 ...

weixin_39633276的博客 162

【JAVA数据结构系列】03_树与二叉树详解

树是一种非线性的数据结构,它是由n ( n>=0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:–以下了解即可–树结构相对线性表就比较复杂了,要存储表示起来就比较麻烦了,实际中树有很多种表示方式,如: 双亲表示法,孩子表示法、孩子双亲表示法、孩子兄弟表示法等等。我们这里就简单的了解其中最常用的孩子兄弟表示法。 文件系统管理(目录和文件)一棵二叉树是结点的一个有限集合,该集合: 从上图可以看出: 证明度为0的节点比度为

400

C++二叉树遍历全解析:从递归到非递归与层序遍历实战

数据结构是计算机科学的核心基础,其中树形结构因其非线性特性,在组织层级数据方面具有独特优势。其遍历原理本质上是将非线性结构线性化访问的过程,深度优先遍历(DFS)和广度优先遍历(BFS)是两大基本策略。理解遍历背后的栈与递归思维转换,是掌握程序控制流和空间管理的关键技术价值,直接影响算法效率和代码健壮性。在应用场景上,遍历是解析语法树、实现游戏AI决策、进行文件系统操作等复杂任务的基石。本文聚焦于二叉树这一基础模型,深入剖析前序、中序、后序三种DFS的非递归实现,以及层序遍历(BFS)的工程实践,通过对比递

weixin_30954265的博客 382

二叉树相关算法实现-iOS

二叉树-你必须要懂!(二叉树相关算法实现-iOS) 这几天详细了解了下二叉树的相关算法,原因是看了唐boy的一篇博客(你会翻转二叉树吗?),还有一篇关于百度的校园招聘面试经历,深刻体会到二叉树的重要性。于是乎,从网上收集并整理了一些关于二叉树的资料,及相关算法的实现(主要是Objective-C的,但是算法思想是相通的),以便以后复习时查阅。 什么是二叉树? 在计算机科学中,二叉树是每个节点...

Leemin_ios的博客 535

二叉树刷题 第六天

二叉树的递归和非递归

jianjiange1的博客 2408
上一篇: 同步互斥相关习题10道 附详解
下一篇: 同步互斥相关习题2 8道 含详解
ChoSeitaku
博客等级 码龄5年 3452粉丝 557原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值