【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,一经查实,立即删除!

相关文章

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是带有线性趋势项的信号序列,输出…

【408真题】2009-28

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

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

作为职场人,遇到发展瓶颈是在所难免的,无论是晋升受限、技能升级缓慢,还是工作激情的丢失,这些挑战都可能让人感到挫败。但是,积极应对,你就可能找到那扇通向新机遇的窗。 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 在刚刚…

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

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

真实机安装完Centos7没有网卡驱动,ifconfig后,只有lo

文章目录 前言一、1查看网卡型号2 下载相应的驱动程序3、参考官方说明 二、总结 前言 参考1 参考2](https://blog.csdn.net/weixin_46945904/article/details/136365222?spm1001.2101.3001.6650.2&utm_mediumdistribute.pc_relevant.none-task-blog-2defaultYuanLiJiHuaP…

检索字符串

自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 在Python中,字符串对象提供了很多应用于字符串查找的方法,这里主要介绍以下几种方法。 (1)count()方…

【busybox记录】【shell指令】rmdir

目录 内容来源: 【GUN】【rmdir】指令介绍 【busybox】【rmdir】指令介绍 【linux】【rmdir】指令介绍 使用示例: 删除空目录 - 默认 删除dirname下的所有空目录,包括因删除其他目录而变为空的目录 常用组合指令: 指令不…

多激光雷达ip与端口配置

首先是雷达的ip 我们连上雷达,想要进入雷达的上位机的时候,需要对本机ip进行一些配置: 第一个是ip,第二个是掩码,第三个是网关。 其中ip可以通过wireshark来进行读取,一般就是192.168.102(雷达默认) 然后掩…

自定义数据集上的3D目标检测:使用OpenPCDet训练CenterPointPillar模型

前言 在自动驾驶和机器人领域,3D目标检测是关键技术之一。它能够提供关于周围环境中物体的精确位置和尺寸信息。OpenPCDet是一个基于PyTorch的开源3D目标检测框架,支持多种3D检测网络。在本文中,我们将探讨如何使用OpenPCDet框架和CenterPoi…