数据结构:链式二叉树(2)

news2024/11/16 0:40:48

目录

前言

一、节点个数

1.1 二叉树的节点个数

1.2 二叉树叶子节点个数

1.3 二叉树第k层节点个数

二、查找值为x的节点

三、判断二叉树是否为完全二叉树


前言

    上一篇 链式二叉树(1),主要是讲了了一些链式二叉树的实现基础以及链式二叉树的遍历,本篇将会将上一篇没完成的实现内容继续完成。

这里还是把实现链式二叉树的头文件放了过来

#include<stdio.h>
#include<stdlib.h>
#include<stdbool.h>
typedef int BTDataType;

typedef struct BinaryTreeNode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;

// 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树
BTNode* BinaryTreeCreate();
// 二叉树销毁
void BinaryTreeDestory(BTNode** root);
// 二叉树节点个数
int BinaryTreeSize(BTNode* root);
// 二叉树叶子节点个数
int BinaryTreeLeafSize(BTNode* root);
// 二叉树第k层节点个数
int BinaryTreeLevelKSize(BTNode* root, int k);
// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x);
// 判断二叉树是否是完全二叉树
bool BinaryTreeComplete(BTNode* root);

因为上一篇已经把链式二叉树的遍历讲完了,这里就暂时把它们去掉了。

一、节点个数

1.1 二叉树的节点个数

int BinaryTreeSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	return BinaryTreeSize(root->left) + BinaryTreeSize(root->right) + 1;
}

    还是用递归解决,把左右子树都遍历一遍,最后再加上最上层的根节点就可以得出二叉树的节点个数。

1.2 二叉树叶子节点个数

int BinaryTreeLeafSize(BTNode* root)
{
	if (root == NULL)
		return 0;
	if (root->left == NULL&&root->right==NULL)
		return 1;
	return BinaryTreeLeafSize(root->left) + BinaryTreeLeafSize(root->right);
}

    在前面的基础知识中讲过叶子结点就是度为0的节点,通过判断该节点是否有左右孩子来记录叶子节点个数,同样是把左右子树都遍历一遍。

1.3 二叉树第k层节点个数

int BinaryTreeLevelKSize(BTNode* root, int k)
{
	if (root == NULL)
		return  0;
	if (k == 1)
		return 1;
	return BinaryTreeLevelKSize(root->left, k - 1) + BinaryTreeLevelKSize(root->right, k - 1);
}

    从最上层节点出发,通过遍历到这k层开始记录返回,如果只在第一层就直接返回1就行了。

二、查找值为x的节点

BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{
	if (root == NULL)
		return NULL;
	if (root->data == x)
		return root;

	if (BinaryTreeFind(root->left, x) != NULL)
		return BinaryTreeFind(root->left, x);
	else if(BinaryTreeFind(root->right, x) != NULL)
		return BinaryTreeFind(root->right, x);
	else
	{
		printf("没找到该值的节点");
		return NULL;
	}
}

     也是涉及遍历,递归,直到找到值为x的节点,这几个链式二叉树功能的实现基本都是涉及递归和遍历。

三、判断二叉树是否为完全二叉树

    首先我们先回顾一下完全二叉树的知识

满二叉树:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是2^k-1 ,则它就是满二叉树。

 完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于深度为K 的,有n个结点的二叉树,当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对 应时称之为完全二叉树。

要实现这个功能需要用到队列的函数实现(数据结构:队列) 

bool BinaryTreeComplete(BTNode* root)
{
	Queue a;
	QueueInit(&a);
	if (root)
		QueuePush(&a, root);
	while (!QueueEmpty(&a))
	{
		BTNode* f = QueueFront(&a);
		if (f == NULL)
			break;
		QueuePop(&a);
		QueuePush(&a, f->left);
	    QueuePush(&a, f->right);
	}
	if (!QueueEmpty(&a))
	{
		QueueDestroy(&a);
		return false;
	}
	QueueDestroy(&a);
	return true;
}

    判断是否为完全二叉树,就需要知道这个二叉树是否符合要求,除了最后一层的节点外,以上的每一层都需要满节点,最后一层的节点要按照按照从左到右的顺序。

    这里用到队列,先让根节点入队,记录根节点,让根节点出队,再让根节点的左右节点入队,再重复上述操作,直到遇到空节点,出循环后,如果队列为空就说明是完全二叉树,因为这个时候就说明每个节点都是按顺序依次排下来的,否则就不是完全二叉树。


     本篇内容就到这里了,链式二叉树的实现也还完成了,希望对各位有帮助,如果有错误欢迎指出。

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

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

相关文章

day28 代码随想录 | 贪心 买卖股票 跳跃游戏 K次取反

买卖股票的最佳时机 II 给你一个整数数组 prices &#xff0c;其中 prices[i] 表示某支股票第 i 天的价格。 在每一天&#xff0c;你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买&#xff0c;然后在 同一天 出售。返回 你能获得的 …

测绘工程项目管理系统,为测绘企业量身定制!测绘项目一体化管理

在日益复杂的测绘工程项目管理领域&#xff0c;高效、精准的信息化管理成为提升工作效率、降低运营成本的关键。企智汇软件&#xff0c;作为一款专为勘察、设计、监测、测绘等多元化工程项目量身打造的管理系统&#xff0c;正逐步成为行业内的佼佼者。 企智汇测绘管理系统深度…

Java FX 学习

声明&#xff1a;参考视频 一. Stage与Scene 舞台与场景&#xff1a;JavaFX应用程序将Ul容器定义为舞台&#xff08;Stage&#xff09;与场景&#xff08;Scene&#xff09;Stage类是顶级容器&#xff0c;它对应于窗体&#xff0c;其内容由Scene决定。Scene类是所有可视化内容…

运维监控体系实践与探索

在当今的数字化时代&#xff0c;运维工作作为企业IT服务的核心&#xff0c;面临着前所未有的挑战与机遇。随着业务规模的扩大和技术栈的复杂化&#xff0c;如何确保系统稳定运行、高效响应&#xff0c;成为运维团队亟需解决的问题。监控体系作为运维工作的基石&#xff0c;其建…

Python+selenium基于PO模式的Web自动化测试框架详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主…

分布式锁 分布式锁解决了什么问题 如何实现 看门狗机制是什么

分布式锁的基本概念 在 Redis 中实现分布式锁的常用方式是通过 SETNX 命令&#xff08;SET with NX option&#xff09;来设置一个键&#xff08;key&#xff09;&#xff0c;这个键代表锁。如果 key 不存在&#xff0c;SETNX 会设置成功&#xff0c;并返回 1&#xff0c;表示…

【LinuxPython】linux中通过源码方式安装python环境

python环境安装直接看第二部分即可。 文章目录 1.背景2.python安装3.包环境复制 1.背景 部署一个线上任务时&#xff0c;相同的代码本地开发机正常产出数据&#xff0c;线上产出数据为0&#xff0c;排查到原因是&#xff1a; ...File "/home/disk1/wangdeyong/venv/pyth…

linux搭建zabbix

zabbix简介 Zabbix是一个监控系统&#xff0c;它可以帮助我们实时检查设备的状态&#xff0c;比如服务器、网络设备等。当设备出现问题时&#xff0c;它会及时通知我们&#xff0c;让我们可以采取措施来解决。同时&#xff0c;它还可以把收集到的数据转化成图表和报告&#xf…

ITL-Internet Technology Letters

文章目录 一、期刊简介二、征稿信息三、投稿须知四、咨询 一、期刊简介 Internet Technology Letters本期旨在涵盖所有用于提高物联网性能的新兴或现代学习算法。在此背景下&#xff0c;我们打算收集有关物联网学习进展的研究论文。强烈鼓励与机器学习、计算智能、概率学习、统…

树和图()

预备知识&#xff08;可以不看&#xff09;&#xff1a; 无向图可以理解为是特殊的有向图 1. 图的遍历&#xff08;因为树可以理解为是特殊的图&#xff0c;因此这里不考虑树的遍历&#xff0c;只考虑图的遍历&#xff09; 给定一个具体的图&#xff0c;便于分析 下面是树的结构…

Servlet——个人笔记

Servlet——个人笔记 文章目录 [toc]Servlet简介Servlet命名Servlet由来实现过程 Servlet 相对 CGI 的优势简要说说什么是CGI Servlet 在IDEA中开发流程Servlet注解方式配置WebServlet注解源码WebServlet注解使用 Servlet常见容器Servlet 生命周期简介测试 Servlet 方法init()…

交叉编译util-linux

参考文章&#xff1a;https://www.cnblogs.com/wanglouxiaozi/p/17836701.html 1、下载源码 https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.39/2、编译 解压压缩包&#xff1a; sudo tar xvf util-linux-2.39.2.tar.gz执行autogen.sh生成configure ./aut…

解锁眼部舒压新境界:WT2605C-AT-L009眼部按摩仪蓝牙语音方案,手机APP控制,让护眼更轻松!

一、开发背景&#xff1a; 随着科技的飞速发展和人们生活品质的提升&#xff0c;眼部按摩仪作为一种能够缓解眼部疲劳、改善眼部血液循环的健康产品&#xff0c;越来越受到消费者的青睐。在众多眼部按摩仪中&#xff0c;采用WT2605C-AT-L009蓝牙模块的应用方案&#xff0c;不仅…

优思学院|PDCA和DMAIC之间如何选择?

在现代组织中&#xff0c;提升方法、质量和效率是企业追求卓越、保持竞争力的核心目标。在这条道路上&#xff0c;DMAIC&#xff08;定义、测量、分析、改进、控制&#xff09;和PDCA&#xff08;计划、执行、检查、行动&#xff09;被广泛应用于持续改进和问题解决。这两者虽然…

基于Java的大学新生入学系统设计与实现----附源码17610

摘要 随着高校规模的不断扩大和新生人数的增加&#xff0c;传统的手工登记和管理方式已经无法满足高效、准确的需求。为了提升大学新生入学迎新工作的效率和质量&#xff0c;本研究设计开发了一套基于Java的大学新生入学系统。系统通过信息技术的应用&#xff0c;集成了首页、校…

GIT IDEA 远程仓库操作

1、配置远程仓库地址 &#xff08;点击推送后如果没有配置远程仓库会让配置远程仓库&#xff09; 2、从远程仓库中下载项目到本地 3、提交->推送 更新代码&#xff08;拉取&#xff09;

PSTX250-600-70软启动器PSTX25060070面价

PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070面价 PSTX250-600-70软启动器PSTX25060070说明书 PSTX250-600-70软启动器PSTX25060070接线图 PSTX250-600-70软启动器PSTX25060070引脚线 PSTX250-60…

配置错误和 IAM 弱点是云安全的主要隐患

根据云安全联盟发布的《2024 年云计算最大威胁》报告&#xff0c;通常与云服务提供商 (CSP) 相关的传统云安全问题的重要性正在持续下降。 配置错误、IAM 弱点和 API 风险仍然至关重要 这些发现延续了 2022 年报告中首次发现的轨迹&#xff0c;同时&#xff0c;诸如错误配置的…

第100+21步 ChatGPT学习:概率校准 Isotonic Regression

基于Python 3.9版本演示 一、写在前面 最近看了一篇在Lancet子刊《eClinicalMedicine》上发表的机器学习分类的文章&#xff1a;《Development of a novel dementia risk prediction model in the general population: A large, longitudinal, population-based machine-learn…

C语言中的结构体和位移段

在C语言中&#xff0c;结构体&#xff08;struct&#xff09;是一种用户自定义的数据类型&#xff0c;允许我们将不同类型的变量组合在一起&#xff0c;形成一个复合数据类型。结构体可以包含整型、浮点型、字符型等多种数据类型的成员。例如&#xff0c;我们可以定义一个表示人…