首页 > 编程知识 正文

二叉堆是完全二叉树吗,二叉堆排序

时间:2023-05-04 00:57:32 阅读:187055 作者:3918

概念二叉树是一种特殊的山,二叉树是完全二元树(二叉树)或几乎完全二元树(二叉树)二叉树)。 两股山有最大的山和最小的山两种。 最大堆:父节点的键值始终大于或等于任何子节点的键值。 最小堆:父节点的键值始终小于或等于任何子节点的键值。

存储二叉树的是数组对象,可以看作是完整的二叉树。 树中的每个节点对应于数组中存储节点值的元素

put操作1 .在堆的末尾添加元素,使该节点成为当前节点

2、比较当前节点及其父节点的大小

当前节点小于父节点时,交换它们的值,将父节点作为当前节点,继续旋转2周

如果当前节点大于或等于父节点,请转至3

3、结束

代码voidput(intnum ) {heap[ size]=num; int x=size; while(x1 ) if ) heap[x 1]heap[x 1] ) swap ) heap[x],heap[x1] ); x=1; }else break; }return; ) get操作1、取出堆内根节点的值

2、将堆的最后一个节点(heap_size )放在根位置,覆盖根,减少堆的长度1

3、根节点为当前父节点,即当前操作节点now

4、如果now没有儿子(nowheap_size/2 )为6; 否则,将now的2个或1个儿子中数值小的一方作为现在的子节点son

5、比较now和son的值,如果now的值小于等于son,则转动6; 否则,交换2个节点的值,将now朝向son旋转4圈

六、结束

代码void Get () {heap[1]=heap[size--]; int x=1; while(x=(size1) ) {int son=x * 2; sonsizeheap [ son1] heap [ son ] ) son; 头[ x ]=头[ son ] ) break; swap(heap[x],heap[son] ); x=son; }return; 例题按n个一组堆积起来,我们利用堆将它们按照从小到大的顺序排列。

样例输入

82 3 9 4 5 3 6 7 样例输入

82 3 9 4 5 3 6 7分析利用根堆的特性,最小值在根元素,每次取出根元素删除,删除至堆空即可

交流电源线# include cstdio # includealgorithmusingnamespacestd; const int MAXN=1000005; int n,heap[MAXN],size=0; void Put () {int x=size; while(x1 ) if ) heap[x 1]heap[x 1] ) swap ) heap[x],heap[x1] ); x=1; }else break; }return; }void Pop () {heap[1]=heap[size--]; int x=1; while(x=(size1) ) {int son=x * 2; sonsizeheap [ son1] heap [ son ] ) son; 头[ x ]=头[ son ] ) break; swap(heap[x],heap[son] ); x=son; }return; }int main () (Scanf ) ' %d ',n ); for(intI=1; i=n; I ) scanf('%d ',heap[ size]; Put (; }for(intI=1; i=n; I ) {printf('%d ',heap[1]; Pop (; }return 0; }配合水果luoguP1090

分析出于贪婪考虑,每次一定要取出最小的两座山进行合并。 这里也利用小根山的特性,每次取出两个根的要素,将它们之和累加到ans中,作为一个新元素添加到山中。

重复此操作n-1次,直到堆中只剩下一个元素

交流电源线# include cstdio # includealgorithmusingnamespacestd; const int MAXN=10005; int n,heap[MAXN],size=0,ans=0; void Put () {int x=size; while(x1 ) if ) heap[x 1]heap[x 1] ) swap ) heap[x],heap[x1] ); x=1; }else break; }return; }void Pop () {heap[1]=heap[size--]; int x=1; while(x=(size1) ) {int son=x * 2; sonsizeheap [ son1] heap [ son ] ) son; 头[ x ]=头[ son ] ) break; swap(heap[x],heap[son] ); x=son; }return; }int main () (Scanf ) ' %d ',n ); for(intI=1; i=n; I ) scanf('%d ',heap[ size]; Put (; }for(intI=1; i n; I ) {int a=heap[1]; Pop (; int b=heap[1]; Pop (; ans =a b; heap[ size]=a b; Put (; }printf('%d”,ans ); 返回0; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。