| 模块 | 描述 |
|---|---|
| 01-Arrays | 数组 |
| 02-Stacks | 栈 |
| 03-Queues | 队列 |
| 04-LinkedList | 链表 |
| 05-Recursion | 递归 |
| 06-Binary-Search-Tree | 二叉查找树 |
| 07-Set-and-Map | 集合和映射 |
| 08-Heap | 最大二叉堆 |
- 线性结构
- 内存中连续存储
- 支持随机访问,复杂度O(1)
- 增、删非尾元素,涉及到元素的迁移,复杂度 O(n)
- 线性结构
- 物理上非连续、非顺序存储
- 不支持随机访问,访问为头节点,复杂度 O(n)
- 增、删节点,复杂度 O(1)
- 线性表
- 后进先出 LIFO
- 线性表
- 先进先出 FIFO
- 非线性表
- 根的左边节点都小于根,右边节点都大于根
- 遍历方法
- 深度优先
- 先序遍历 根 > 左 > 右
- 中序遍历 左 > 根 > 右
- 后序遍历 左 > 右 > 根
- 广度优先
- 深度优先
- 无序
- 元素不可重复
- 键值对
二叉堆是一种特殊的堆,二叉堆是完全二叉树或者近似完全二叉树。
当父节点的键值总是大于或等于任何一个子节点的键值时为"最大堆"。
当父节点的键值总是小于或等于任何一个子节点的键值时为"最小堆"。
二叉堆一般用数组来表示。如果根节点在数组中的位置是1,第n个位置的子节点分别在2n和 2n+1。因此,第1个位置的子节点在2和3,第2个位置的子节点在4和5。以此类推。这种基于1的数组存储方式便于寻找父节点和子节点。
如果存储数组的下标基于0,那么下标为i的节点的子节点是2i + 1与2i + 2;其父节点的下标是⌊floor((i − 1) ∕ 2)⌋
如下图的两个堆:
1 11
/ \ / \
2 3 9 10
/ \ / \ / \ / \
4 5 6 7 5 6 7 8
/ \ / \ / \ / \
8 9 10 11 1 2 3 4
将这两个堆保存在以1开始的数组中:
位置: 1 2 3 4 5 6 7 8 9 10 11
左图: 1 2 3 4 5 6 7 8 9 10 11
右图: 11 9 10 5 6 7 8 1 2 3 4