当前位置: 首页 > article >正文

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

目录

链式二叉树示意图

手搓一个链式二叉树

计算链式二叉树第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.kler.cn/a/387665.html

相关文章:

  • 口碑很好的国产LDO芯片,有哪些?
  • 《OpenCV计算机视觉实战项目》——银行卡号识别
  • JS爬虫实战演练
  • DSP+Simulink——点亮LED灯(TMSDSP28379D)超详细
  • 【权限管理】CAS(Central Authentication Service)
  • 陪诊问诊APP开发实战:基于互联网医院系统源码的搭建详解
  • 单片机串口接收状态机STM32
  • [Web安全 网络安全]-DoS(拒绝服务攻击)和DDoS(分布式拒绝服务攻击)
  • 二进制与网络安全
  • ✍Qt自定义带图标按钮
  • 微信小程序——用户隐私保护指引填写(详细版)
  • 「C/C++」C/C++ 数组初始化的几种方法
  • springboot028基于springboot的房屋租赁系统
  • 【优选算法 — 滑动窗口】最大连续1的个数 将 x 减到0的最小操作数
  • Android的BroadcastReceiver
  • Linux实验day05-Linux磁盘分区的规则、磁盘分区、格式化、挂载、df、du命令
  • 【AI日记】24.11.09 我对贫困问题的一些思考
  • 《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
  • UE5材质篇 2 ICE 冰材质尝试
  • 前端前置——ajax
  • 前端递归获取树(不限制层级)结构下的某个字段并组成数组返回
  • WPF 打包
  • Vue前端开发之自定义动画
  • 如何在 Android 14 中调整字体最大 大小 和 显示最大一格 大小
  • 【AI技术】Edge-TTS 国内使用方法