【入门级-数据结构-3、特殊树:完全二叉树的数组表示法】

完全二叉树:是除最后一层外,其余层节点全满,且最后一层节点都靠左排列的二叉树,它的结构特性让它可以用连续数组高效存储(无需指针 / 引用),这也是堆(优先队列)的底层实现原理。

一、核心规则

我们约定:数组下标从 0 开始(最常用),对完全二叉树任意一个节点 i:

父节点下标:(i - 1) /2 (整数除法)

左孩子下标:2 * i + 1

右孩子下标:2 * i + 2

二、示例演示说明

  1. 完全二叉树结构
    0 (根节点)
    / \
    1 2
    / \ /
    3 4 5
  2. 对应数组

    0, 1, 2, 3, 4, 5

  3. 公式验证
    节点 1(下标 1):父 =(1-1)/2=0,左 = 3,右 = 4
    节点 2(下标 2):父 =(2-1)/2=0,左 = 5,右 = 6(正常如果有右孩子的话是6,本示例无右孩子)
    节点 5(下标 5):父 =(5-1)/2=2

三、C语言实现方法

c 复制代码
#include <stdio.h>
// 求父节点下标
int getParent(int i)
{
    if(i == 0) 
        return -1;  // 根节点无父节点
    return (i - 1) / 2;
}

// 求左孩子下标
int getLeft(int i)
{
    return 2 * i + 1;
}

// 求右孩子下标
int getRight(int i)
{
    return 2 * i + 2;
}

int main()
{
    // 完全二叉树数组:0 1 2 3 4 5
    int tree[] = {0, 1, 2, 3, 4, 5};
    int n = sizeof(tree) / sizeof(tree[0]);

    printf("完全二叉树数组元素:");
    for(int i = 0; i < n; i++)
    {
        printf("%d ", tree[i]);
    }
    printf("\n\n");

    // 遍历每个节点,打印父子关系
    for(int i = 0; i < n; i++)
    {
        printf("下标%d  节点值 = %d\n", i, tree[i]);
        
        int p = getParent(i);
        if(p == -1)
            printf("  -> 根节点,无父节点\n");
        else
            printf("  -> 父节点下标:%d,值:%d\n", p, tree[p]);

        int L = getLeft(i);
        if(L < n)
            printf("  -> 左孩子下标:%d,值:%d\n", L, tree[L]);
        else
            printf("  -> 无左孩子\n");

        int R = getRight(i);
        if(R < n)
            printf("  -> 右孩子下标:%d,值:%d\n", R, tree[R]);
        else
            printf("  -> 无右孩子\n");

        printf("------------------------\n");
    }

    return 0;
}

运行输出:

下标0 节点值 = 0
-> 根节点,无父节点
-> 左孩子下标:1,值:1
-> 右孩子下标:2,值:2

下标3 节点值 = 3

-> 父节点下标:1,值:1
-> 无左孩子
-> 无右孩子

下标5 节点值 = 5

-> 父节点下标:2,值:2

-> 无左孩子

-> 无右孩子

四、数组表示法的特点

优点

内存高效:连续数组存储,无额外指针开销

访问极快:通过公式直接计算父子节点,O (1) 时间复杂度

结构天然:完全二叉树不会产生数组空洞,空间利用率 100%

缺点

仅适用于完全二叉树:普通二叉树用数组会产生大量空位,浪费空间

相关推荐
zww89491113 分钟前
家政派单系统实战指南:从需求分析到智能调度算法落地
算法·需求分析
手写码匠16 分钟前
华为云Flexus+DeepSeek征文|Dify 多 Agent 评测实战:用 DeepSeek-R1 当裁判,打造多智能体系统的自动化质量保障体系
人工智能·深度学习·算法·aigc
ZC跨境爬虫37 分钟前
LeetCode 88. 合并两个有序数组(双指针详解 + Java Python 实现)
java·python·算法·leetcode
Nil20839 分钟前
leetcode 238除了自身以外数组的乘积
数据结构·算法·leetcode
土司大王40 分钟前
LeetCode hot100——最长连续序列
数据结构·算法·leetcode
caimouse41 分钟前
ReactOS 图形系统分析(17):区域填充 — EngPaint / IntEngPaint(paint.c)
c语言·开发语言·算法
生态学者1 小时前
Ecological Indicators | 机场鸟调的新方法:用 AWM-PC1 读懂干扰梯度下的鸟类群落
人工智能·算法·r语言·微信公众平台
Herbert_hwt1 小时前
第六章 Java深入理解接口、函数式接口与lambda表达式
java·开发语言·算法
君君思密达1 小时前
LeetCode Hot 100 题目详解-滑动窗口
算法·leetcode·职场和发展
GreenTea9 小时前
深度解读 Anthropic 多智能体报告:更强的模型 ≠ 更好的协调
前端·后端·算法