数据结构之顺序结构二叉树详解

数据结构之顺序结构二叉树详解

顺序结构二叉树是一种基于数组的存储方式,特别适用于完全二叉树,能够通过数学关系直接定位父子节点,实现高效存储与操作。以下从核心概念、实现原理、应用场景等维度详细解析:


一、基本概念与特点
  1. 存储原理

    • 顺序存储将二叉树按层序编号映射到数组中,索引关系如下:
      • 左子节点:索引为 2i+1
      • 右子节点:索引为 2i+2
      • 父节点:索引为 (i-1)/2(向下取整)
      • 示例:数组 [1,2,3,4,5,6,7] 中,索引2(值为3)的左子节点为5(索引5),右子节点为6(索引6)13967
  2. 适用场景

    • 完全二叉树:数组存储无空间浪费(如满二叉树)22
    • 堆结构:大根堆/小根堆的实现基础,常用于优先队列、堆排序7367
    • 非完全二叉树:需填充空节点,空间利用率低(如普通二叉树的数组存储会存在大量空位)46

二、核心实现:堆(Heap)
  1. 堆的定义

    • 大根堆:父节点值 ≥ 子节点值。
    • 小根堆:父节点值 ≤ 子节点值。
    • 结构体
      typedef struct Heap {
          int* arr;        // 动态数组
          int size;        // 有效数据个数
          int capacity;    // 数组容量
      } HP;
      
      731
  2. 关键操作算法

    • 向上调整(Insert)

      • 场景:插入新元素到堆尾,逐层与父节点比较并交换。
      • 时间复杂度:O(logN)(N为堆高度)731
      void AdjustUp(int* arr, int child) {
          int parent = (child - 1) / 2;
          while (child > 0 && arr[child] > arr[parent]) {
              swap(&arr[child], &arr[parent]);
              child = parent;
              parent = (child - 1) / 2;
          }
      }
      
    • 向下调整(Delete)

      • 场景:删除堆顶元素后,将堆尾元素移至堆顶,逐层与较大子节点交换。
      • 时间复杂度:O(logN)731
      void AdjustDown(int* arr, int n, int parent) {
          int child = 2 * parent + 1;
          while (child < n) {
              if (child + 1 < n && arr[child+1] > arr[child]) child++;
              if (arr[child] > arr[parent]) {
                  swap(&arr[child], &arr[parent]);
                  parent = child;
                  child = 2 * parent + 1;
              } else break;
          }
      }
      
  3. 建堆的时间复杂度

    • 筛选法建堆:从最后一个非叶子节点(索引 n/2-1)开始向下调整。
    • 复杂度:O(N)(数学证明基于满二叉树的节点数公式)7367

三、应用场景与扩展
  1. 堆排序

    • 步骤
      1. 建堆(大根堆或小根堆)。
      2. 交换堆顶与堆尾元素,缩小堆范围并调整堆。
      3. 重复直到排序完成。
    • 复杂度:时间复杂度 O(NlogN),空间复杂度 O(1)7356
  2. Top-K 问题

    • 解决方案:维护大小为K的小根堆,遍历数据时保留最大的K个元素73
  3. 文件系统与内存管理

    • 文件目录:树形结构通过顺序存储实现快速路径查找1
    • 内存分配:操作系统使用堆结构管理动态内存73

四、优缺点对比
对比项顺序存储链式存储
空间效率完全二叉树无浪费,普通二叉树浪费大46灵活,无空间浪费22
访问速度随机访问快(通过索引)67需遍历指针,速度较慢46
插入/删除效率低(需移动元素)46效率高(仅修改指针)51
适用场景完全二叉树、堆173任意形态二叉树、频繁动态操作51

五、代码示例(前序遍历)
// 顺序存储二叉树的前序遍历(递归实现)
public void preOrder(int index) {
    System.out.print(arr[index] + " ");
    int left = 2 * index + 1;
    if (left < arr.length) preOrder(left);
    int right = 2 * index + 2;
    if (right < arr.length) preOrder(right);
}

输入数组 [1,2,3,4,5,6,7] 输出:1 2 4 5 3 6 73967


结语

顺序结构二叉树通过数组与数学关系实现了对完全二叉树的高效存储,尤其适合堆的实现与排序算法。理解其索引规则与调整算法是掌握优先级队列、内存管理等高级应用的基础。对于非完全二叉树,链式存储仍是更优选择。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值