C语言数据结构之满二叉树、完全二叉树的节点数计算详解

 更新时间:2026年01月07日 08:45:50   作者:iuu_star  
这篇文章主要介绍了C语言数据结构之满二叉树、完全二叉树节点数计算的相关资料,通过代码示例详细展示了如何计算这两种二叉树的节点数量,包括总节点数、叶子数、度为1和度为2的节点数,需要的朋友可以参考下

一、基本概念

1.1 满二叉树

定义:高度为 h 的二叉树,如果它有最大的节点数(2ʰ-1个),则称为满二叉树。

特征

  • 每一层都达到最大节点数

  • 所有叶子都在最后一层

  • 每个非叶子节点都有两个子节点

  • 没有度为1的节点(要么0个子,要么2个子)

1.2 完全二叉树

定义:高度为 h 的二叉树,除第 h 层外,其他各层都达到最大节点数,且第 h 层的节点都连续集中在最左边

特征

  • 叶子节点只在最后两层

  • 最后一层的叶子都靠左排列

  • 度为1的节点最多只有1个

  • 适合用数组存储(没有空洞)

1.3 两种二叉树对比

特性满二叉树完全二叉树
度1节点总是0个0个或1个
叶子位置全在最后一层最后两层
节点公式N=2ʰ-1无简单公式
叶子公式L=2ʰ⁻¹L=⌈N/2⌉
存储效率最高(无浪费)高(数组存储无空洞)
常见应用理论分析、完美平衡堆排序、优先级队列

二、代码详解

2.1 满二叉树计算

  • 先检查边界:高度必须>0,否则直接返回

  • 套用公式计算

  • 按顺序输出:先总节点,再叶子,然后度2,最后度1(总是0)

void fullBinaryTree(int height) {
    if (height <= 0) return;  // 第1步:参数检查
    
    // 第2步:核心计算
    int total_nodes = pow(2, height) - 1;      // 公式1:总节点数 = 2^h - 1
    int leaf_nodes = pow(2, height - 1);       // 公式2:叶子数 = 2^(h-1)
    int degree2_nodes = leaf_nodes - 1;        // 公式3:度2节点 = 叶子数 - 1
    
    // 第3步:输出结果
    printf("\n高度为 %d 的满二叉树:\n", height);
    printf("总节点数: %d\n", total_nodes);
    printf("叶子节点数: %d\n", leaf_nodes);
    printf("度2节点: %d\n", degree2_nodes);
    printf("度1节点: 0\n");  // 第4步:满二叉树特性(无度1节点)
}

2.2 完全二叉树计算

  • 边界检查:节点数必须>0

  • 依次计算:高度 → 叶子数 → 度1节点 → 度2节点(用减法)

  • 简洁输出:直接显示所有结果

void completeBinaryTree(int n) {
    if (n <= 0) return;  // 第1步:参数检查
    
    // 第2步:计算三个关键值
    int h = (int)(log2(n)) + 1;          // 公式1:高度 = ⌊log₂n⌋ + 1
    int leaves = (n + 1) / 2;            // 公式2:叶子数 = ⌈n/2⌉
    int degree1 = (n % 2 == 0) ? 1 : 0;  // 公式3:度1节点(偶数1,奇数0)
    int degree2 = n - leaves - degree1;  // 公式4:度2节点 = 总数 - 叶子 - 度1
    
    // 第3步:输出结果
    printf("\n%d个节点的完全二叉树:\n", n);
    printf("高度: %d\n", h);
    printf("叶子数: %d\n", leaves);
    printf("度1节点: %d\n", degree1);
    printf("度2节点: %d\n", degree2);
}

2.3 主函数main

int main() {
    // 1. 演示满二叉树
    printf("== 满二叉树示例 ==");
    fullBinaryTree(3);  // 高度为3的满二叉树
    
    // 2. 演示完全二叉树
    printf("\n== 完全二叉树示例 ==");
    completeBinaryTree(9);  // 9个节点的完全二叉树
    
    return 0;
}

三、总结

这段二叉树节点关系计算代码体现了清晰的设计思路和实现逻辑。代码采用模块化设计,将满二叉树和完全二叉树的计算分别封装为独立函数,每个函数功能单一、接口明确。

实现上直接应用数学公式:满二叉树部分基于高度h推导所有节点数,完全二叉树部分基于节点总数n计算各项数值。关键算法包括高度计算中的对数运算和类型转换,叶子数计算中的整数除法技巧,以及度1节点数的奇偶判断逻辑。

到此这篇关于C语言数据结构之满二叉树、完全二叉树的节点数计算的文章就介绍到这了,更多相关C语言满二叉树、完全二叉树节点数计算内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MFC之ComboBox控件用法实例教程

    MFC之ComboBox控件用法实例教程

    这篇文章主要介绍了MFC之ComboBox控件用法,包括了ComboBox控件常见的各类用法,非常具有实用价值,需要的朋友可以参考下
    2014-09-09
  • C++ 中类对象类型的转化的实例详解

    C++ 中类对象类型的转化的实例详解

    这篇文章主要介绍了C++ 中类对象类型的转化的实例详解的相关资料,这里提供实例帮助大家学习理解这部分内容,需要的朋友可以参考下
    2017-08-08
  • C语言实现三子棋实例代码

    C语言实现三子棋实例代码

    大家好,本篇文章主要讲的是C语言实现三子棋实例代码,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2022-01-01
  • Qt之简单的异步操作实现方法

    Qt之简单的异步操作实现方法

    这篇文章主要介绍了Qt之简单的异步操作实现方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11
  • 二叉树遍历 非递归 C++实现代码

    二叉树遍历 非递归 C++实现代码

    对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现
    2013-09-09
  • C++反射的一种实现方法详解

    C++反射的一种实现方法详解

    这篇文章主要给大家介绍了关于C++反射的一种实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用C++具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-06-06
  • C语言合并排序及实例代码

    C语言合并排序及实例代码

    本篇文章主要介绍C语言合并排序算法,这里对合并排序通过实例代码进行了详细讲解,希望能帮助到大家学习
    2016-07-07
  • 详解C语言内核字符串转换方法

    详解C语言内核字符串转换方法

    在内核开发模式下,初始化字符串也需要调用专用的初始化函数,如下分别初始化ANSI和UNCODE字符串,本文我们就来看看代码是如何实现的
    2022-09-09
  • C++扫雷游戏的简单制作

    C++扫雷游戏的简单制作

    这篇文章主要为大家详细介绍了C++扫雷游戏的简单制作,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • c++ 如何在libuv中实现tcp服务器

    c++ 如何在libuv中实现tcp服务器

    这篇文章主要介绍了c++ 如何在libuv中实现tcp服务器,帮助大家更好的理解和使用libuv,感兴趣的朋友可以了解下
    2021-02-02

最新评论