二叉树-堆

目录

二叉树的顺序结构

堆概念及结构

堆的性质

堆的实际意义

选择题


二叉树的顺序结构

普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个是操作系统中管理内存的一块区域分段

  • 物理结构:数组
  • 逻辑结构:完全二叉树
  • 完全二叉树一层一层的存储到数组里面。(堆实现需要二者结合理解)
  • 堆——数据结构 完全二叉树
  • 堆——c语言/操作系统/内存区域的划分

二叉树-堆_第1张图片

堆概念及结构

如果有一个关键码的集合K = { , , ,…, },把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

二叉树-堆_第2张图片

堆的性质

  • 堆中某个节点的值总是不大于或不小于其父节点的值
  • 堆总是一棵完全二叉树
  • 完全二叉树一层一层存储到数组内
  • 满二叉树or完全二叉树
  • 父子节点间下标关系:parent=(child-1)/2
  • leftchild=parent*2+1
  • rightchild=parent*2+2
  • *2:到孩子层面
  • +1:奇数(左孩子)
  • +2:偶数(右孩子)
  • 完全二叉树的高度h=log2(N+1)  N节点数

 二叉树-堆_第3张图片

堆一般,是数组数据看做一棵完全二叉树

小堆要求:任意一个父亲 <= 孩子

大堆要求:任意一个父亲 >= 孩子 

二叉树-堆_第4张图片 

堆的实际意义

  • 堆排序 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

二叉树-堆_第5张图片 

 2.已知小根堆为8,15,10,21,34,16,12,删除关键字 8 之后需重建堆,在此过程中,关键字之间的比较次
数是()。C
A 1
B 2
C 3
D 4

二叉树-堆_第6张图片

二叉树-堆_第7张图片

 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] 

二叉树-堆_第8张图片

  • 把删除的对顶元素和最后一个元素交换
  • 删除最后一个元素
  • 然后向下调整,交换

感谢大家的阅读,若有错误和不足,欢迎指正

你可能感兴趣的:(初阶数据结构,数据结构,c语言)