【C++课程学习】:二叉树的基本函数实现

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

🍉二叉树的结构类型:

🍉1.创建二叉树函数(根据数组,前序遍历创建二叉树):

🍉2.销毁二叉树函数:

🍉3.前序遍历函数:

🍉4.二叉树的节点个数函数:

🍉5.计算二叉树叶子节点的个数函数:

 🍉6.计算第k层的节点个数:

🍉7.查找节点为k的元素,返回这个元素的指针

🍉8.层序遍历,借助队列:

🍉判断是否为完全二叉树:


前言:

学了那么久的二叉树,现在基本的二叉树学的差不多了,现在就给大家带来二叉树的几个基本函数。函数有几个,但是基本都不难,基本就是用了分治,递归的思想,画递归展开图也是一种很好理解递归过程好方法,等熟悉以后,就对递归有了更深的理解,面对有一些问题就直接可以写出来。

🍉二叉树的结构类型:

//二叉树的节点结构类型
typedef struct BinaryTreeNode {
    BTDataType data;
    struct BinaryTreeNode* left;        //左孩子节点的地址
    struct BinaryTreeNode* right;        //右孩子的地址
}BTNode;

每个父节点都包:

1.含存储的数据。

2.左孩子地址。

3.右孩子节点的地址。

🍉1.创建二叉树函数(根据数组,前序遍历创建二叉树):

画递归展开图也是很好理解的,先创建父亲节点,然后往左走,遇到‘#’,就返回NULL,返回上一层。

//根据数组创建二叉树,下面举例的是字符数组,创建的顺序是前序遍历
BTNode* BinaryTreeCreate(BTDataType* a, int* pi)
{if (a[*pi] == '#'){(*pi)++;return NULL;}BTNode* root = (BTNode*)malloc(sizeof(BTNode));root->data = a[*pi];	//前序遍历,先创建中间根节点(*pi)++;root->left = BinaryTreeCreate(a,pi);	//左子树root->right = BinaryTreeCreate(a,pi);	//右子树return root;	//返回root节点
}

🍉2.销毁二叉树函数:

销毁二叉树也可以前序遍历删除,也可以中序删除。不过如果是前序删除,就要在先保存左右孩子的节点。如果是中序删除,就是要保存右节点。

只有后序遍历删除不要保存节点。

// 二叉树销毁
void BTDestory(BTNode** root)
{if (*root == NULL)return;//后序遍历销毁二叉树BTDestory(&(*root)->left);BTDestory(&(*root)->right);free(*root);*root = NULL;
}

🍉3.前序遍历函数:

前序遍历和中序遍历和后序遍历基本差不多,只有后面的两个函数和打印的顺序不一样。

//前序遍历
void BTPreOreder(BTNode* root)
{if (root == NULL){printf("# ");return;}printf("%c ",root->data);BTPreOreder(root->left);BTPreOreder(root->right);
}

🍉4.二叉树的节点个数函数:

分治思想也是yyds

// 二叉树节点个数
int BTSize(BTNode* root)
{if (root == NULL)return 0;//个数等于左树节点个数+右树节点个数+1return BTSize(root->left)+BTSize(root->right)+1;
}

🍉5.计算二叉树叶子节点的个数函数:

分治

// 二叉树叶子节点个数
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);
}

 🍉6.计算第k层的节点个数:

要注意的是,遇到NULL,要返回,还有就是,k==1,return 1,要在后面,因为如果在前面,k确实等于1。但是这时候是空节点,所以不能return 1,所以return 1要在后面。

// 二叉树第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);
}

🍉7.查找节点为k的元素,返回这个元素的指针

找父节点,父节点不是,就去左树,左树没有,就去右树。

只要找到了就返回,所以是或的关系;

// 二叉树查找值为x的节点
BTNode* BinaryTreeFind(BTNode* root, BTDataType x)
{if (root == NULL)return NULL;if (root->data == x)return root;BTNode* p1 = BinaryTreeFind(root->left, x);if (p1!=NULL)return p1;BTNode* p2 = BinaryTreeFind(root->right, x);if (p2!=NULL)return p2;return NULL;
}

🍉8.层序遍历,借助队列:

先在队列中插入root,在队列头出一个数据,就入这个节点的左右孩子节点。因为队列有先进先出的特点,所以能达到层序的目的。

// 层序遍历
void BinaryTreeLevelOrder(BTNode* root)
{Queue ps;QueueInit(&ps);QueuePush(&ps, root);while (!QueueEmpty(&ps)){BTNode* node = QueueTop(&ps);if (node == NULL){break;}else{printf("%c ", node->data);		QueuePush(&ps, node->left);QueuePush(&ps, node->right);}QueuePop(&ps);}QueueDestroy(&ps);
}

🍉9.判断是否为完全二叉树:

先入数据,然后出,和层序遍历一样,当需要NULL就结束。然后看后面的队列是否都是NULL,如果只要有一个不是NULL,那肯定就不是完全二叉树了,前面都有NULL,后面又出现节点。

// 判断二叉树是否是完全二叉树
int BinaryTreeComplete(BTNode* root)
{Queue ps;QueueInit(&ps);QueuePush(&ps, root);while (!QueueEmpty(&ps)){BTNode* node = QueueTop(&ps);if (node == NULL){break;}else{QueuePush(&ps, node->left);QueuePush(&ps, node->right);}QueuePop(&ps);}while (!QueueEmpty(&ps)){BTNode* node = QueueTop(&ps);if (node != NULL)return 0;QueuePop(&ps);}return 1;
}

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

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

相关文章

如何向一个六岁的孩子讲解JavaScript 闭包的工作原理是什么?

作为一位六岁孩子的父亲,目前我正在教小孩子们编程(同时我自己也是一个对编程没有正式教育的新手),我认为最好的学习方式是通过实际操作。如果六岁的孩子已经准备好理解闭包的概念,那么他们也足够大,可以自己动手试一试。下面的解释文字可能更适合十岁左右的孩子。 案例…

30【Aseprite 作图】桌子——拆解

1 桌子只要画左上方,竖着5,斜着3个1,斜着两个2,斜着2个3,斜着一个5,斜着一个很长的 然后左右翻转 再上下翻转 在桌子腿部分,竖着三个直线,左右都是斜线;这是横着水平线不…

Python os.path.isfile() 和 os.path.isdir() 函数

Python os.path.isfile 和 os.path.isdir 函数 正文 正文 在网上看到很多人对这两个函数的用法有过说明,然而感觉都没有说到它们的本质,这里特来记录一下。os.path.isfile() 用来判断所给参数是否一个文件。os.path.isdir() 用来判断所给的参数是否是一…

Mybatis多表查询

MyBatis-多表查询-一对一查询(方式一) 一个菜品对应一个分类 直接菜品记录category对象 菜品id写入Dish,后面的分类直接写入 Category类 封装,如果sql不能封装上,那么直接使用resultmap封装 使用resultType只能封装基本属性 所以要定义一个resultmap手动封装 使用标签 要…

Python数据处理,使用 tkinter 模块点击获取文件目录

Python数据处理,使用 tkinter 模块点击获取文件目录 正文 正文 当我们进行数据处理读取文件内数据的时候,通常,我们需要设定好一个存放当前文件所在目录的变量。比如如下目录: file_path rC:\Users\xxx\Desktop\DataSet\Data.c…

【车载开发系列】Vector工具链的安装

【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装 【车载开发系列】Vector工具链的安装一. VectorDriver二. DaVinci_Developer三. DaVinci Configurator 一. VectorDriver Vector Driver Setup是Vector产品链中重要的驱动软件,所有的硬件设备进行连接…

mvc的常见注解

问文心一言的,记录一下。 PathVariable 路径变量注解 PathVariable 是 Spring MVC 提供的一个注解,它用于从 URI 模板变量中绑定值到控制器方法的参数上。当你在 RequestMapping、GetMapping、PostMapping、PutMapping、DeleteMapping 等注解的 URL 路…

写Python时不用import,你会遭遇什么

from *** import *** 想必你已经再熟悉不过这样的python语法。 当你的 python 代码需要获取外部的一些功能(一些已经造好的轮子),你就需要使用到 import 这个声明关键字。import可以协助导入其他 module 。(类似 C 预约的 inclu…

信号处理中简单实用的方法

最小二乘法拟合消除趋势项 消除趋势项函数 在MATLAB的工具箱中已有消除线性趋势项的detrend函数;再介绍以最小二乘法拟合消除趋势项的polydetrend 函数。 函数:detrend功能:消除线性趋势项 调用格式:ydetrend(x) 说明:输入参数x是带有线性趋势项的信号序列,输出…

salesforce 公式字段 判断一个字段是否在某个多选列表中

在 Salesforce 中,你可以使用公式字段来判断一个字段的值是否在一个多选列表中。这通常涉及使用包含特定值的函数和一些字符串操作。以下是一个常见的方法: 假设你有一个多选列表字段 Multi_Select_Field__c,你想检查这个字段是否包含某个值…

函数式接口:现代编程的利器

1. 引言 在软件开发的演进过程中,函数式编程(Functional Programming, FP)逐渐显露头角,成为解决复杂问题的有效工具之一。函数式接口作为函数式编程的核心概念之一,其重要性不言而喻。本文将深入探讨函数式接口的概念…

【408真题】2009-28

“接”是针对题目进行必要的分析,比较简略; “化”是对题目中所涉及到的知识点进行详细解释; “发”是对此题型的解题套路总结,并结合历年真题或者典型例题进行运用。 涉及到的知识全部来源于王道各科教材(2025版&…

C++进程间通信 匿名管道和命名管道

C进程间通信 匿名管道和命名管道 1. 匿名管道匿名管道概述匿名管道代码示例代码解释运行结果 2. 命名管道命名管道概述命名管道代码示例写入数据的程序(writer.cpp)读取数据的程序(reader.cpp) 代码解释运行步骤运行结果 匿名管道…

遇到软件测试职业瓶颈,如何突破

作为职场人,遇到发展瓶颈是在所难免的,无论是晋升受限、技能升级缓慢,还是工作激情的丢失,这些挑战都可能让人感到挫败。但是,积极应对,你就可能找到那扇通向新机遇的窗。 1. 自我评估 识别问题 是缺乏技能…

2024年四川省三支一扶报名流程图解✅

2024年四川省三支一扶报名流程图解✅ 🔴时间安排 1、报名时间:5月31日—6月4日17:00 2、资格初审时间:5月31日—6月5日17:00 3、准考证打印时间:6月25日—6月29日 4、笔试时间:6月30日 5、笔试成绩:7…

电脑显示由于找不到msvcr110.dll 无法继续执行如何处理?最简单的修复msvcr110.dll文件方法

电脑显示由于找不到msvcr110.dll 无法继续执行?当你看到这种提示的时候,请不要紧张,这种是属于dll文件丢失,解决起来还是比较简单的,下面会详细的列明多种找不到msvcr110.dll的解决方法。 一.找不到msvcr110.dll是怎么…

【credit_based流控机制】

credit_based流控机制 1 credit_based way1.1 Principle1.3 DFD1.4 Module1.4.1 Interface1.4.2 Code Block 在网络芯片处理大流量报文中,一般主要是两种机制:1.valid–ready反压(backpressure)机制;2.credit信用机制; credit机制…

idea、datagrip注册记录下

一、DataGrip注册 DataGrip版本号:DataGrip 2023.2 访问地址:https://3.jetbra.in/ 点击“hardbin.com”,下载“jetbra.zip” 在vm里面添加上: -javaagent:D:\work\idea\jetbra\ja-netfilter.jarjetbrains重启datagrip 在刚刚…

自然语言处理(NLP)中的迁移学习

Transfer Learning in NLP 迁移学习(Transfer Learning)无疑是目前深度学习中的新热点(相对而言)。在计算机视觉领域,它已经应用了一段时间,人们使用经过训练的模型从庞大的ImageNet数据集中学习特征&…

英飞凌24GHz毫米波雷达-BGT24LTR11N16家用机器人应用

BGT24LTR11N16基础描述: 关于BGT24LTR11N16,它是一款用于信号生成和接收的硅锗雷达MMlC,工作频率为24.00GHz至24.25GHz ISM频段。它基于24GHz基本电压控制振荡器(VCO)。 这颗芯片是属于1T1R,也就是一发一收…