数据结构之顺序结构二叉树详解
顺序结构二叉树是一种基于数组的存储方式,特别适用于完全二叉树,能够通过数学关系直接定位父子节点,实现高效存储与操作。以下从核心概念、实现原理、应用场景等维度详细解析:
一、基本概念与特点
-
存储原理
-
适用场景
二、核心实现:堆(Heap)
-
堆的定义
-
关键操作算法
-
向上调整(Insert):
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):
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; } }
-
-
建堆的时间复杂度
三、应用场景与扩展
-
堆排序
-
Top-K 问题
- 解决方案:维护大小为K的小根堆,遍历数据时保留最大的K个元素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 7
3967。
结语
顺序结构二叉树通过数组与数学关系实现了对完全二叉树的高效存储,尤其适合堆的实现与排序算法。理解其索引规则与调整算法是掌握优先级队列、内存管理等高级应用的基础。对于非完全二叉树,链式存储仍是更优选择。