该部分内容主要针对堆结构进行归纳总结,核心内容在于能讲述清楚堆的特征、构造过程以及插入/删除操作,最好是结合图示进行学习,事半功倍!
1.堆的特征
什么是堆?堆就是将数据按照完全二叉树顺序进行存储,实际数据存储在数组中的结构。
大根堆:任意节点值大于左右孩子===>根节点最大
小根堆:任意节点值小于左右孩子===>根节点最小
数组下标与节点父子关系:当前节点下标为i,那么它的父节点的下标就是(i-1)/2,如下图所示
2.堆的构造过程
那么如何构造一个堆呢?
以构造大根堆为例:首先需要有一个原始序列,比如[0,1,2,3,4,5,6,7,8,9],从序列尾部的父节点开始不断调整子树使其满足大根堆,最终使得整个树满足大根堆的要求。【需要调整的节点已经加粗表示】
调整以4为根的子树:
调整以3为根的子树:
调整以2为根的子树:
调整以1为根的子树:
调整以0为根的子树:
最终构造的大根堆如图:
3.堆插入操作
只需要插入完全二叉树中第一个空节点(null)处,然后不断调整即可!其调整类似于“冒泡过程”,将大(小)元素不断向上冒泡即可!
4.堆删除操作
堆删除操作非常有意思,用一个故事概括就是:皇上突然驾崩了,这时候先找个大臣维持局面,大臣先看左右两个皇子谁更强谁就是老大,然后大臣步步隐退,直到找到属于自己的位置(来自鱼骨头)。
OK,《算法通关村第十四关——堆结构青铜挑战笔记》结束,喜欢的朋友三联加关注!关注鱼市带给你不一样的算法小感悟!(幻听)
再次,感谢鱼骨头教官的学习路线!鱼皮的宣传!小y的陪伴!ok,拜拜,第十四关第二幕见!