堆树

一、堆树的定义

堆树的定义如下:

(1)堆树是一颗完全二叉树;

(2)堆树中某个节点的值总是不大于或不小于其孩子节点的值;

(3)堆树中每个节点的子树都是堆树。

当父节点的键值总是大于或等于任何一个子节点的键值时为最大堆。 当父节点的键值总是小于或等于任何一个子节点的键值时为最小堆。如下图所示,左边为最大堆,右边为最小堆。


二、堆树的操作

以最大堆为例进行讲解,最小堆同理。

原始数据为a[] = {4, 1, 3, 2, 16, 9, 10, 14, 8, 7},采用顺序存储方式,对应的完全二叉树如下图所示:

(1)构造最大堆

在构造堆的基本思想就是:首先将每个叶子节点视为一个堆,再将每个叶子节点与其父节点一起构造成一个包含更多节点的对。

所以,在构造堆的时候,首先需要找到最后一个节点的父节点,从这个节点开始构造最大堆;直到该节点前面所有分支节点都处理完毕,这样最大堆就构造完毕了。

假设树的节点个数为n,以1为下标开始编号,直到n结束。对于节点i,其父节点为i/2;左孩子节点为i*2,右孩子节点为i*2+1。最后一个节点的下标为n,其父节点的下标为n/2。


如下图所示,最后一个节点为7,其父节点为16,从16这个节点开始构造最大堆;构造完毕之后,转移到下一个父节点2,直到所有父节点都构造完毕。

C++代码实现:

定义存放堆的结构如下:

strcut MaxHeap
{
Etype *heap;
int HeapSize;
int MaxSize;
};
MaxHeap H;

其中,heap是数据元素存放的空间,下标从1开始存数数据,下标为0的作为工作空间,存储临时数据。HeapSize是数据元素的个数,MaxSize是存放数据元素空间的大小。

初始化堆方法如下:

void MaxHeapInit (MaxHeap &H)
{
for(int i = H.HeapSize/2; i>=1; i--)
{
H.heap[0] = H.heap[i];
int son = i*2;
while(son <= H.HeapSize)
{
if(son < H.HeapSize && H.heap[son] < H.heap[son+1])
son++;
if(H.heap[0] >= H.heap[son])
break;
else
{
H.heap[son/2] = H.heap[son];
son *= 2;
}
}
H.heap[son/2] = H.heap[0];
}
}

(2)最大堆中插入节点

最大堆的插入节点的思想就是先在堆的最后添加一个节点,然后沿着堆树上升。跟最大堆的初始化过程大致相同。

C++代码实现:

void MaxHeapInsert (MaxHeap &H, EType &x)
{
if(H.HeapSize == H.MaxSize)
return false;
int i = ++H.HeapSize;
while(i!=1 && x>H.heap[i/2])
{
H.heap[i] = H.heap[i/2];
i = i/2;
}
H.heap[i] = x;
return true;
}

(3)最大堆中堆顶节点的删除

最大堆堆顶节点删除思想如下:将堆树的最后的节点提到根结点,然后删除最大值,然后再把新的根节点放到合适的位置

C++代码实现:

void MaxHeapDelete (MaxHeap &H, EType &x)
{
if(H.HeapSize == 0)
return false;
x = H.heap[1];
H.heap[0] = H.heap[H.HeapSize--];
int i = 1, son = i*2;
while(son <= H.HeapSize)
{
if(son <= H.HeapSize && H.heap[0] < H.heap[son+1])
son++;
if(H.heap[0] >= H.heap[son])
break;
H.heap[i] = H.heap[son];
i = son;
son = son*2;
}
H.heap[i] = H.heap[0];
return true;
}

三、堆树的应用

利用最大堆、最小堆进行排序。

堆排序算法详解:http://blog.csdn.net/guoweimelon/article/details/50904231


参考文献:

1、彻底弄懂最大堆的四种操作(图解+程序)(JAVA) http://128kj.iteye.com/blog/1728555

2、最大堆、最小堆 http://blog.csdn.net/genios/article/details/8157031

转载于:https://www.cnblogs.com/leebxo/p/11058555.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/536373.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

问题 D: 最小生成树II

问题 D: 最小生成树II 时间限制: 1 Sec 内存限制: 128 MB 提交: 89 解决: 44 [提交] [状态] [讨论版] [命题人:admin] 题目描述 小A有一张n个点的带权无向图&#xff0c;这张无向图非常特别&#xff0c;首先第i个点有一个点权ai&#xff0c;之后这张无向图是一张完全图&…

问题 G: 区间权值

问题 G: 区间权值 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 49 [提交] [状态] [讨论版] [命题人:admin] 题目描述 小Bo有n个正整数a1..an&#xff0c;以及一个权值序列w1…wn&#xff0c;现在他定义 现在他想知道的值&#xff0c;需要你来帮帮他 你只需要输出答案…

问题 I: 连通块计数

问题 I: 连通块计数 时间限制: 1 Sec 内存限制: 128 MB 提交: 108 解决: 45 [提交] [状态] [讨论版] [命题人:admin] 题目描述 小A有一棵长的很奇怪的树&#xff0c;他由n条链和1个点作为根构成&#xff0c;第i条链有ai个点&#xff0c;每一条链的一端都与根结点相连。 现在…

telnet 功能启用并测试端口是否正常

记录日期&#xff1a;2019年6月21日 13点52分 操作系统&#xff1a;Windows 10 由于 Ping命令可以检查网络是否连通&#xff0c;但无法准确判断某个端口是否连通&#xff0c;因此需要使用 Telnet协议。 1、打开控制面板中的程序和功能。 2、侧边栏&#xff0c;启用或关闭Window…

步步为营 SharePoint 开发学习笔记系列 七、SharePoint Timer Job 开发

概要 项目需求要求我们每天晚上同步员工的一些信息到sharepoint 的user List &#xff0c;我们决定定制开发sharepoint timer Job,Sharepoint timer Job是sharePoint的定时作业Job,需要安装、布曙到服务器上,而这里我只是介绍下Job开发的例子&#xff0c;以供大家学习用。 开发…

问题 J: 寻找复读机【模拟】

问题 J: 寻找复读机 时间限制: 1 Sec 内存限制: 128 MB 提交: 131 解决: 50 [提交] [状态] [讨论版] [命题人:admin] 题目描述 某个QQ群里一共有n个人&#xff0c;他们的编号是1..n&#xff0c;其中有一些人本质上是复读机。 小A发现&#xff0c;如果一个人的本质是复读机&…

windows下jenkins常见问题填坑

没有什么高深的东西&#xff0c;1 2天的时间大多数人都能自己摸索出来&#xff0c;这里将自己遇到过的问题分享出来避免其他同学再一次挖坑. 目录 1. 主从节点 2. Nuget自动包还原 3. powershell部署 4. 内网机器实现基于变化的构建 5. Github私有项目pull时限 所谓主从&#x…

Cow Contest【最短路-floyd】

Cow Contest POJ - 3660 N (1 ≤ N ≤ 100) cows, conveniently numbered 1..N, are participating in a programming contest. As we all know, some cows code better than others. Each cow has a certain constant skill rating that is unique among the competitors. …

【学习Android NDK开发】Type Signatures(类型签名)

类型签名&#xff08;Type Signatures&#xff09; (<Parameter 1 Type Code>[<Parameter 1 Class>];...)<Return Type Code> The JNI uses the Java VM’s representation of type signatures. Following Table shows these type signatures. Type Signatur…

Symantec(赛门铁克)非受管检测

为了查找局域网内没有安装赛门铁克客户端的IP&#xff0c;采用Symantec Endpoint Protect Manager 的非受管检测机制进行网段扫描。 非受管检测机制的原理是&#xff1a;每台电脑开机时都会向同网段电脑发arp&#xff0c;当非受管检测器接到arp请求时&#xff0c;会写入本地的a…

SQL语句性能优化操作

1、对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在where及order by涉及的列上建立索引。 2、应尽量避免在where子句中对字段进行null值判断&#xff0c;创建表时NULL是默认值&#xff0c;但大多数时候应该使用NOT NULL&#xff0c;或者使用一个特殊的值…

sql语言特殊字符处理

我们都知道SQL Server查询过程中&#xff0c;单引号“”是特殊字符&#xff0c;所以在查询的时候要转换成双单引号“”。但这只是特殊字符的一个&#xff0c;在实际项目中&#xff0c;发现对于like操作还有以下特殊字符&#xff1a;下划线“_”&#xff0c;百分号“%”&#xf…

小节

算法导论已学两部分&#xff0c;第一部分是基础知识&#xff0c;第二部分是排序。基础知识介绍如何分析证明算法以及求时间复杂度。第二部分的排序学了很长时间。先是从简单排序到复杂排序的一个过渡&#xff0c;打开了很多思路。然后就是无尽的算法分析。算法分析的时间比理解…

SPS2003升级到MOSS2007相关资料及问题总结

这几天要把客户的SPS2003门户升级到MOSS2007的&#xff0c;客户SPS2003门户&#xff0c;数据26G&#xff0c;使用了自定义WebPart、自定义页面、SSO等功能。升级过程中碰到大量问题。其中主要的问题有几个&#xff0c;在这里把它们整理一下> 1、sps2003升级时&#xff0c;升…

Milking Time【动态规划-dp】

Milking Time POJ - 3616 Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as po…

HTTP首部(1)

1、报文首部 HTTP协议的请求和响应必定包含HTTP首部&#xff0c;它包括了客户端和服务端分别处理请求和响应提供所需要的信息。报文主体字儿是所需要的用户和资源的信息都在这边。  HTTP请求报文组成 方法&#xff0c;URL&#xff0c;HTTP版本&#xff0c;HTTP首部字段 HTTP响…

UVA272--TEX Quotes【字符串】

TEX Quotes UVA - 272 题目传送门 题目大意&#xff1a;将输入字符串中的所有对双引号的做双引号改为 &#xff0c;右双引号改为 。 解决方法&#xff1a;遍历一遍及时修改即可。 AC代码&#xff1a; #include <cstdio> #include <iostream> #include <…

XMLHttpRequest+WebForm模式(接口IHttpHandler)实现ajax

首先引入ajax.js文件 创建xmlhttpRequest对象 Code//创建XMLHttpRequest对象var xmlHttp;function newXMLHttpRequest() { if (window.XMLHttpRequest) { xmlHttp new XMLHttpRequest(); } else if (window.ActiveXObject) { try { xmlHttp …

UVA----10082 WERTYU【字符串】

WERTYU UVA - 10082 题目传送门 题目大意&#xff1a;按照所给的键盘样式&#xff0c;以及错误的字符串&#xff0c;输出正确的字符串&#xff0c;其输入的每一个字符都按照键盘样式向右错移了一位。 解决方法&#xff1a;将整个键盘用数组存起来&#xff0c;遍历一遍即可。…

关于C生成的汇编与C++生成的汇编在函数名称上的差异

最近用到ucos&#xff0c;这个RTOS本身是用C语言和部分汇编编写&#xff0c;而自己又打算用C来写应用&#xff0c;在其中遇到几个问题&#xff0c;一番折腾之后&#xff0c;让我更加深刻认识到了在一些一般不注意的细节上&#xff0c;C与C的不同。 1、对于ucos&#xff0c;虽…