二叉树的顺序结构
普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段
- 物理结构:数组
- 逻辑结构:完全二叉树
- 完全二叉树一层一层的存储到数组里面。(堆实现需要二者结合理解)
- 堆——数据结构 完全二叉树
- 堆——c语言/操作系统/内存区域的划分
- 有序数组一定是堆,堆不一定是有序数组
堆概念及结构
如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。
- 大堆 parent <= child
- 小堆 parent >= child
- child之间无大小关系
堆的性质
- 堆中某个节点的值总是不大于或不小于其父节点的值
- 堆总是一棵完全二叉树
- 有序数组一定是堆,堆不一定是有序数组
- 完全二叉树一层一层存储到数组内
- 满二叉树or完全二叉树
- 父子节点间下标关系:parent=(child-1)/2 (注意:除法)
- leftchild=parent*2+1
- rightchild=parent*2+2
- *2:到孩子层面
- +1:奇数(左孩子)
- +2:偶数(右孩子)
- 完全二叉树的高度h=log2(N+1) N节点数
堆一般,是数组数据看做一棵完全二叉树
小堆要求:任意一个父亲 <= 孩子
大堆要求:任意一个父亲 >= 孩子
堆的实际意义
- 堆排序 O(N*logN)
- Top-K问题:从n个未排序的数中得到的最大的k个数(最小的k个数做法也相似)
- 搜索二叉树
- AVL树/红黑树
- 不在和前面的顺序表/链表/栈一样是存储数据,增删查改而已了!!
选择题
1.下列关键字序列为堆的是:()A
A 100,60,70,50,32,65
B 60,70,65,50,32,100
C 65,100,70,32,50,60
D 70,65,100,32,50,60
E 32,50,100,70,65,60
F 50,100,70,65,60,32
2.已知小根堆为8,15,10,21,34,16,12,删除关键字 8 之后需重建堆,在此过程中,关键字之间的比较次
数是()。C
A 1
B 2
C 3
D 4
3.一组记录排序码为(5 11 7 2 3 17),则利用堆排序方法建立的初始堆为
A(11 5 7 2 3 17)
B(11 5 7 2 17 3)
C(17 11 7 2 3 5)
D(17 11 7 5 3 2)
E(17 7 11 3 5 2)
F(17 7 11 3 2 5)
4.最小堆[0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()C
A[3,2,5,7,4,6,8]
B[2,3,5,7,4,6,8]
C[2,3,4,5,7,8,6]
D[2,3,4,5,6,7,8]
- 把删除的对顶元素和最后一个元素交换
- 删除最后一个元素
- 然后向下调整,交换
🙂感谢大家的阅读,若有错误和不足,欢迎指正