数据结构 ——— 计算链式二叉树第k层的节点个数

devtools/2024/11/7 11:31:41/

目录

二叉树>链式二叉树示意图

手搓一个二叉树>链式二叉树

计算二叉树>链式二叉树第k层的节点个数 


二叉树>链式二叉树示意图


手搓一个二叉树>链式二叉树

代码演示:

// 数据类型
typedef int BTDataType;// 二叉树节点的结构
typedef struct BinaryTreeNode
{BTDataType data; //每个节点的数据struct BinaryTreeNode* left; //指向左子树的指针struct BinaryTreeNode* right; //指向右子树的指针
}BTNode;// 申请新节点
BTNode* BuyNode(BTDataType x)
{BTNode* newnode = (BTNode*)malloc(sizeof(BTNode));// 判断是否申请成功if (newnode == NULL){perror("malloc fail");return NULL;}// 初始化newnode->data = x;newnode->left = NULL;newnode->right = NULL;return newnode;
}BTNode* CreatBinaryTree()
{BTNode* n1 = BuyNode(1);assert(n1);BTNode* n2 = BuyNode(2);assert(n2);BTNode* n3 = BuyNode(3);assert(n3);BTNode* n4 = BuyNode(4);assert(n4);BTNode* n5 = BuyNode(5);assert(n5);BTNode* n6 = BuyNode(6);assert(n6);n1->left = n2;n1->right = n4;n2->left = n3;n4->left = n5;n4->right = n6;return n1;
}

计算二叉树>链式二叉树第k层的节点个数

代码演示:

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

代码解析:

要保证 k 大于 0 ,因为层数不可能为负数,利用 assert 断言
当 root 为空的时候,那么就是没有节点,返回 0
上面的 root 判空已经确保了 root 为空的情况,所以只需要判断 k 是否为 1 的情况
为什么要判断 k 是否为 1 呢?
因为是计算第 k 层的节点个数,可以把第一层看作 k ,层数越高,k 就递减,当 k 递减到 1 时,那一层就是第 k 层
最后再将 root 的左右子树所得到的第 k 层的个数相再返回,就是第 k 层的节点个数

大致走读代码(以上图为例子):

首次进入函数,root 为 1 节点,那么先走 BTreeLevelKSize(root->left, k - 1)
直到走到 root 为 3 节点的 left 节点,left 节点为空,返回 0
返回到上一层,也就是 root 为 3 节点的时候,再走 root 的 right 节点,同样为空,返回 0
再次返回到 root 为 3 节点的时候,这时候的 k 为 1,那么就返回 1
返回到 root 为 2 节点的时候,2 节点的 right 为空, 返回 0
2 节点的左右子树都走完了,返回 1 + 0
返回到 root 为 1 节点的时候,再走 BTreeLevelKSize(root->right, k - 1)………………
最后递归走完后,返回的值就是第 k 层的节点个数

代码验证:


http://www.ppmy.cn/devtools/132002.html

相关文章

三维测量与建模笔记 - 3.2 直接线性变换法标定DLT

DLT - Direct Linear Transform 上图中,透视成像对应的公式是共线方程,可以参考以下链接: https://zhuanlan.zhihu.com/p/101549821https://zhuanlan.zhihu.com/p/101549821 对于标定来说,需要找到。已知量是。 (u,v)是…

【力扣打卡系列】单调队列

坚持按题型打卡&刷&梳理力扣算法题系列,语言为go,Day21 单调队列——滑动窗口最大值 题目描述解题思路 单调队列 双端队列 移除最左边的元素移除最右边的元素在最右边插入元素 单调性 从队首到队尾单调递减 代码参考 func maxSlidingWindow(…

Qt的C++中实现一个文本转语音(TTS)系统

为了在Qt的C++中实现一个文本转语音(TTS)系统,支持中英文发音,以下是详细的解决方案,包括可用的模型和代码实现方案。 实现需求 已有模型选择:推荐使用 Vosk 或 Mozilla TTS 模型,这些模型都可以离线使用,支持多语言且免费。 Vosk:主要为语音识别库,但支持语音生成插…

基因组学与个性化健康:精准医疗的未来方向

基因组学(Genomics)是指对基因组,即一个生物体的全部基因和遗传信息进行分析和研究的科学,旨在探索基因在生物体中的功能、相互作用及其对健康和疾病的影响。个性化健康(Personalized Health)则是基于个体的…

BERT 模型在句子分类任务中的作用分析笔记

在以数字(如 1、2、3、4、5 等)为标签的句子分类任务中,BERT 各层结构和功能的分析如下: 模型结构和作用 Embedding 层 Token Embedding:将词汇映射到向量空间中,每个词汇被表示为一个固定维度的向量&…

架构零散知识点

1 数据库 1.1 数据库范式 有一个学生表,主键是学号,含有学生号、学生名、班级、班级名,违反了数据库第几范式? --非主属性不依赖于主键,不满足第二范式 有一个订单表,包含以下字段:订单ID&…

一:Linux学习笔记(第一阶段)-- 安装软件 vmware workstation 虚拟机软件 centos系统

目录 学习计划: 资源准备 虚拟机软件:就别自己找了 现在换网站了 下载比较费劲 Centos8: 阿里云镜像地址下载(下载比较版 但是有不同版本):centos安装包下载_开源镜像站-阿里云 百度网盘地址&#xff…

多模态大模型微调实践!PAI+LLaMA Factory搭建AI导游

一、引言 AI的快速发展推动了各行各业的智能化转型和创新,随之而来的是对AI应用的迫切需求。 如何微调大模型、高效搭建AI应用成为了开发者们广泛关注的技术方向。阿里云人工智能平台PAI,联合开源低代码大模型微调框架LLaMA Factory ,共同打…