二叉树的广度优先遍历和题目

news/2024/9/19 1:56:38 标签: 宽度优先, 算法

二叉树广度优先遍历利用队列 。

typedef char BTDataType;
typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
typedef BTNode* QDataType;
 // 链式结构:表示队列 
typedef struct QueueNode 
{ 
    struct QueueNode* next; 
    QDataType data; 
}QueueNode;
// 队列的结构 两个指针分别记录链表的头和尾
typedef struct Queue 
{ 
	QueueNode* head; 
	QueueNode* tail; 
}Queue;
// 广度优先遍历 1.先把根入队列 2.出队头的数据,把他的下一层入进去
// 特点:借助队列的先进先出性质,上一层出的时候带入下一层 队列的代码参考前面的博客
void LevelOrder(BTNode* root)
{
	 Queue q;
	 QueueInit(&q);
	 if(root)
	 	QueuePush(&q, root);
	 
	 while(!QueueEmpty(&q))
	 {
	 	BTNode* front = QueueFront(&q); 
	 	QueuePop(&q);
	 	printf("%d ",front->left);
	 	if(front->left)
	 		QueuePush(&q, front->left);
	 	if(front->right)
	 		QueuePush(&q, front->right);
	 }
	 QueueDestory(&q);
}
// 判断二叉树是否为完全二叉树 完全二叉树按层序走,节点是连续的,当出到NULL之后后面全是NULL就是完全二叉树,
// 如果后面有非空,那么就不是,说明节点层序走,非空节点不连续
bool BinaryTreeComplete(BTNode* root)
{
	 Queue q;
	 QueueInit(&q);
	 if(root)
	 	QueuePush(&q, root);
	 while(!QueueEmpty(&q))
	 {
	 	BTNode* front = QueueFront(&q);
	 	QueuePop(&q);
	 	if(front == NULL)
	 	{
	 		break;
	 	}
	 	QueuePush(root->left);
	 	QueuePush(root->right)l
	 }
	 while(!QueueEmpty(&q))
	 {
	 	BTNode* front = QueueFront(&q);
	 	QueuePop(&q);
	 	if(front)
	 		return false;
	 }
	 QueueDestory(&q);
	 return true;
}
// 创建节点
BTNode* CreateTreeNode (BTDataType x)
{
	BTNode* n1 = (BTNode*)malloc(sizeof(BTNode));
	n1->data = x;
	n1->left = NULL;
	n1->right = NULL:
	return node;
}
int main()
{
	// 手动连接上图中的树
	BTNode* A = CreateTreeNode('A');
	BTNode* B = CreateTreeNode('B');
	BTNode* C = CreateTreeNode('C');
	BTNode* D = CreateTreeNode('D');
	BTNode* E = CreateTreeNode('E');
	BTNode* F = CreateTreeNode('F');
	A->left = B;
	A->right = C;
	B->left = D;
	C->left = E;
	c->right = F;
	// 二级做法BinaryTreeDestory(&A);
	// 一级做法
	BinaryTreeDestory(A);
	A = NULL;
}

题目
单值二叉树
在这里插入图片描述

二叉树的前序遍历:用C语言做题,需要创建数组,首先确定数组大小,遍历一遍得到个数,然后用子函数进行递归,不然用主函数递归每次都需要创建数组的操作。对于i需要传地址,因为当递归返回之后,不传地址的情况下,i会倒退到之前没有++的情况,导致给数组放值会混乱
在这里插入图片描述

相同的树:都同时走到空的 要返回真。如果有一个为空一个不为空则返回假。如果两个值不相同返回假。这三个条件都是终止条件。值如果相同不用管相当于是往下走的进行条件。
在这里插入图片描述


http://www.niftyadmin.cn/n/5664845.html

相关文章

深入理解Go语言中的并发封闭与for-select循环模式

在现代编程中,并发已经成为提高程序性能和响应能力的关键手段。然而,在并发环境下,如何安全地访问和操作共享数据却是一大挑战。本文将深入探讨Go语言中的**封闭(confinement)**技术,以及常见的for-select循环模式,帮助您编写更高效、更安全的并发代码。 并发编程中的安…

linux-Shell 编程-常用 Shell 脚本技巧

Linux Shell 编程:常用 Shell 脚本技巧 一、概述 Shell 脚本是 Linux 系统管理员和开发人员日常自动化任务的重要工具。通过编写 Shell 脚本,用户可以自动化重复性工作、简化系统维护、管理服务器资源等。Shell 脚本的强大之处在于其简洁和灵活性&…

Spring Boot-依赖冲突问题

Spring Boot 依赖冲突问题及其解决方案 1. 引言 在Spring Boot项目中,依赖管理是一个至关重要的环节。Spring Boot通过自动配置和强大的依赖管理简化了应用开发,但随着项目规模扩大和依赖数量的增加,依赖冲突问题常常会浮现。依赖冲突不仅会…

FreeSql 全面指南:从基础到高级实战,深入解析读写分离与导航属性

FreeSql 使用详解:从入门到高级 FreeSql 是一个开源的、轻量级的 ORM 框架,它为 .NET 开发人员提供了丰富的功能,包括 CRUD 操作、读写分离、多租户、导航属性支持等。相比于 Entity Framework Core,FreeSql 在性能和特性上有一些…

纯血鸿蒙NEXT常用的几个官方网站

一、官方文档 https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/Readme-CN.md刚入门查看最多的就是UI开发模块,首先要熟悉组件使用 二、官方API参考 https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/development-i…

【C++】多态的认识和理解

个人主页 文章目录 ⭐一、多态的概念🎄二、多态的定义及实现1.多态的构成2.实现多态的条件3.虚函数的概念4.虚函数的重写和覆盖5.析构函数的重写6.协变7.override和 final关键字8.重载、重写/覆盖、隐藏这三者的区别 🏠三、纯虚函数和抽象类的关系&#…

pgrouting实战应用

1)下载地区地区数据(下载数据是XYZM 四位数据) 2)下载裁剪行政区数据 3)使用arcgis pro添加路网数据和行政区数据 4)裁剪数据,仅历下行政区路网 5)arcgis pro要素转线&#xff0…

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

文章目录 窗口显示流程明确目标 窗户内容绘制与显示流程窗口Surface的5种状态完整流程图 应用端处理finishDrawingWindow 的触发 system_service处理WindowState状态 -- COMMIT_DRAW_PENDING本次layout 流程简述applySurfaceChangesTransaction 方法概览READY_TO_SHOW和HAS_DRA…