飞蛋糕 發表於 2026-1-7 08:45:50

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>一、基本概念</li><ul class="second_class_ul"><li>1.1 满二叉树</li><li>1.2 完全二叉树</li><li>1.3 两种二叉树对比</li></ul><li>二、代码详解</li><ul class="second_class_ul"><li>2.1 满二叉树计算</li><li>2.2 完全二叉树计算</li><li>2.3 主函数main</li></ul><li>三、总结</li><ul class="second_class_ul"></ul></ul></div><p class="maodian"></p><h2>一、基本概念</h2>
<p class="maodian"></p><h3>1.1 满二叉树</h3>
<p><strong>定义</strong>:高度为 h 的二叉树,如果它有最大的节点数(2ʰ-1个),则称为满二叉树。</p>
<p><strong>特征</strong>:</p>
<ul><li><p>每一层都达到最大节点数</p></li><li><p>所有叶子都在最后一层</p></li><li><p>每个非叶子节点都有两个子节点</p></li><li><p>没有度为1的节点(要么0个子,要么2个子)</p></li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010708405339.png" /></p>
<p class="maodian"></p><h3>1.2 完全二叉树</h3>
<p><strong>定义</strong>:高度为 h 的二叉树,除第 h 层外,其他各层都达到最大节点数,且第 h 层的节点都<strong>连续集中在最左边</strong>。</p>
<p><strong>特征</strong>:</p>
<ul><li><p>叶子节点只在最后两层</p></li><li><p>最后一层的叶子都靠左排列</p></li><li><p>度为1的节点最多只有1个</p></li><li><p>适合用数组存储(没有空洞)</p></li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010708405382.png" /></p>
<p class="maodian"></p><h3>1.3 两种二叉树对比</h3>
<table><thead><tr><th>特性</th><th>满二叉树</th><th>完全二叉树</th></tr></thead><tbody><tr><td><strong>度1节点</strong></td><td>总是0个</td><td>0个或1个</td></tr><tr><td><strong>叶子位置</strong></td><td>全在最后一层</td><td>最后两层</td></tr><tr><td><strong>节点公式</strong></td><td>N=2ʰ-1</td><td>无简单公式</td></tr><tr><td><strong>叶子公式</strong></td><td>L=2ʰ⁻&sup1;</td><td>L=&lceil;N/2&rceil;</td></tr><tr><td><strong>存储效率</strong></td><td>最高(无浪费)</td><td>高(数组存储无空洞)</td></tr><tr><td><strong>常见应用</strong></td><td>理论分析、完美平衡</td><td>堆排序、优先级队列</td></tr></tbody></table>
<p class="maodian"></p><h2>二、代码详解</h2>
<p class="maodian"></p><h3>2.1 满二叉树计算</h3>
<ul><li><p><strong>先检查边界</strong>:高度必须&gt;0,否则直接返回</p></li><li><p><strong>套用公式计算</strong></p></li><li><p><strong>按顺序输出</strong>:先总节点,再叶子,然后度2,最后度1(总是0)</p></li></ul>
<div class="jb51code"><pre class="brush:cpp;">void fullBinaryTree(int height) {
    if (height &lt;= 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节点)
}</pre></div>
<p class="maodian"></p><h3>2.2 完全二叉树计算</h3>
<ul><li><p><strong>边界检查</strong>:节点数必须&gt;0</p></li><li><p><strong>依次计算</strong>:高度 &rarr; 叶子数 &rarr; 度1节点 &rarr; 度2节点(用减法)</p></li><li><p><strong>简洁输出</strong>:直接显示所有结果</p></li></ul>
<div class="jb51code"><pre class="brush:cpp;">void completeBinaryTree(int n) {
    if (n &lt;= 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);
}</pre></div>
<p class="maodian"></p><h3>2.3 主函数main</h3>
<div class="jb51code"><pre class="brush:cpp;">int main() {
    // 1. 演示满二叉树
    printf("== 满二叉树示例 ==");
    fullBinaryTree(3);// 高度为3的满二叉树
   
    // 2. 演示完全二叉树
    printf("\n== 完全二叉树示例 ==");
    completeBinaryTree(9);// 9个节点的完全二叉树
   
    return 0;
}</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202601/2026010708405339.png" /></p>
<p class="maodian"></p><h2>三、总结</h2>
<p>这段<strong>二叉树节点关系计算</strong>代码体现了清晰的设计思路和实现逻辑。代码采用模块化设计,将满二叉树和完全二叉树的计算分别封装为独立函数,每个函数功能单一、接口明确。</p>
<p>实现上直接应用数学公式:满二叉树部分基于高度h推导所有节点数,完全二叉树部分基于节点总数n计算各项数值。关键算法包括高度计算中的对数运算和类型转换,叶子数计算中的整数除法技巧,以及度1节点数的奇偶判断逻辑。</p>
<p>到此这篇关于C语言数据结构之满二叉树、完全二叉树的节点数计算的文章就介绍到这了,更多相关C语言满二叉树、完全二叉树节点数计算内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C++二叉树结构的建立与基本操作</li><li>c++二叉树的几种遍历算法</li><li>C++ 数据结构二叉树(前序/中序/后序递归、非递归遍历)</li><li>C++实现二叉树遍历序列的求解方法</li><li>C++实现二叉树基本操作详解</li><li>C++ 数据结构完全二叉树的判断</li><li>C++ 二叉树的实现超详细解析</li><li>c++先序二叉树的构建详解</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C语言数据结构之满二叉树、完全二叉树的节点数计算详解