社区
C语言
帖子详情
如何建立一个二叉树最大堆.
skycncomp
2004-04-29 02:55:57
如题?
输入任意位有效数字,建立一颗二叉树的最大堆。
既二叉树根是最大数字。
...全文
987
13
打赏
收藏
如何建立一个二叉树最大堆.
如题? 输入任意位有效数字,建立一颗二叉树的最大堆。 既二叉树根是最大数字。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
skycncomp
2004-05-13
打赏
举报
回复
哪位给写一个了。谢谢了。
bobseadream
2004-05-06
打赏
举报
回复
这实际是一个堆排序问题,首先是要将序列建成堆的形式。
将一个无序的序列建成堆的过程实际上是一个反复筛选的过程。若将此序列看作是一棵完全二叉树,则最后一个非终端结点是[n/2](不大于n/2的整数),因此筛选过程只需从[n/2]开始。要建成一个大顶堆,即先选择一个值最大的元素并与序列中的最后一个元素交换,然后对序列前n-1元素进行筛选,从新调整为一个大顶堆,直到结束。
算法描述如下:
typedef int[] Elem;//采用顺序存储表示完全二叉树
void HeapAdjust(Elem &e,int s,int m)
{//e中s...m的元素除e[s]之外已经满足堆的定义(e[i]<=e[2*i]&&e[i]<=e[2*i+1]
//或e[i]>=e[2*i]&&e[i]>=e[2*i+1]),调整e[s]使的e[s...m]成为一个大顶堆。
selem=e[s];
for(i=2*s;i<=m;i*=2)//沿着值较大的元素(结点)向下筛选
{
if(i<m && e[i]<e[i+1])++i;//i为值较大的元素下标
if(selem>=e[i])break;
e[s]=e[i];
s=i;
}
e[s]=selem;
}
void HeapSort(Elem &e)
{//对顺序表排序
for(i=e.length/2;i>0;--i)
HeapAdjust(e,i,e.length);
for(i=e.length;i>1;--i)
{
temp=e[1]; //将堆中的最后一个元素与第一个元素交换
e[1]=e[i];
e[i]=temp;
HeapAdjust(H,1,i-1);//调整1..i-1的元素成为大顶堆
}
}
skycncomp
2004-05-06
打赏
举报
回复
没有哪位好心人给帮帮忙呀。我实是在解决不了了。
或者给一些思路也行。
sniperHW
2004-05-06
打赏
举报
回复
这个程序我上两个礼拜刚写过.C++写的.等我回去把程序传上来吧.
bobseadream
2004-05-06
打赏
举报
回复
如果想要了解更具体的描述,建议参考一下清华大学出版社的严蔚敏那本《数据结构》教材。里面有详细的讲解。
skycncomp
2004-05-02
打赏
举报
回复
那该如何考虑呀。
好长时间没有解决了。大家帮帮忙了。
newegg2002
2004-05-01
打赏
举报
回复
这个问题很复杂的,在我看来..解决它势必会用到线性表和二叉树的两种操作才行..
newegg2002
2004-05-01
打赏
举报
回复
提问题的分不用得..是可用分..每天自动会加十分的.如果你经常登录的话..
得的分是专家分.不能用来提问题的..
skycncomp
2004-05-01
打赏
举报
回复
谁给我解决一下呀。
好几天了。
谢谢了。
skycncomp
2004-04-30
打赏
举报
回复
哪位给解释一下了。
我每次问的都无人答这是怎么回事呀。
晕…………
skycncomp
2004-04-30
打赏
举报
回复
我只剩下10分了。没有分呀。不是我的错。
请问楼上的如何得分呀。
我是菜鸟,懂得少,回答不了别人提出的问题
这可怎么办呀。
chenzhichao2008
2004-04-30
打赏
举报
回复
今天没空明天给你答案怎么样,
可能你给的分有点少吧,不过我是一个唯一不在意分数的人呵
skycncomp
2004-04-29
打赏
举报
回复
如输入1,2,3,4,5,6,7,8,9
二叉树如下:
9
/ 8 7
/ \ / 6 5 4 3
/ 2 1
【C语言】
二叉树
(堆及堆排序,四种遍历方式,节点个数,判断是否是完全
二叉树
等...)
结点是数据结构中的基础,是构成复杂数据结构的基本组成单位。本系列文章中提及的结点专指树的结点。例如:结点A在图中表示为:树(Tree)是n(n>=0)个结点的有限集。n=0 时称为空树。在任意一颗非空树中:此外,树的定义还需要强调以下两点: 1)n>0时根结点是唯一的,不可能存在多个根结点,数据结构中的树只能有
一个
根结点。 2)m>0时,子树的个数没有限制,但它们一定是互不相交的。 示例树: 一棵普通的树:
一个
节点含有的子树的个数称为该节点的度; 下图标注了所示树的各个结点的度。结点子树的根结点为该结点的孩
C语言【数据结构】
二叉树
实现堆及堆排序
前言:这一篇先用完全
二叉树
来实现堆及堆排序,下一篇将会把整个初阶的
二叉树
完结。 一.
二叉树
的顺序结构及堆的概念 1.
二叉树
的顺序结构 普通的
二叉树
是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全
二叉树
更适合使用顺序结构存储。现实中我们通常把堆(一种
二叉树
)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,
一个
是数据结构,
一个
是操作系统中管理内存的一块区域分段。 2.堆的概念及结构 (1)堆的概念 如果有
一个
集合K = { k0,k1 ,k2.
二叉树
--堆
堆是
一个
完全
二叉树
; 堆中每
一个
节点的值都必须大于等于(或小于等于)其子树中每个节点的值。 每个节点的值都大于等于子树中每个节点值的堆,我们叫做“大顶堆”。对于每个节点的值都小于等于子树中每个节点值的堆,我们叫做“小顶堆”。 完全
二叉树
比较适合用数组来存储。用数组来存储完全
二叉树
是非常节省存储空间的。单纯地通过数组的下标,就可以找到
一个
节点的左右子节点和父节点。数组中下标为i的节点的左子节点,就是下标为i*2的节点,右子节点就是下标为i∗2+1的节点,父节点就是下标为i/2的节点..
【
最大堆
的操作】完全
二叉树
建立
最大堆
/插入/删除结点C语言实现
最大堆
的插入 步骤: 1.将新插入元素放在size+1的位置 2.向上过滤结点使之满足
最大堆
的特点
最大堆
的删除 基本概念:对于
一个
完全
二叉树
,结点序号为i的左孩子是2i,右孩子是2i+1。 步骤 1.堆是否为空(为空则无法删除) 2.若不为空,取出根结点的最大元素 3.将数组下标最大的
一个
元素提出来,放在根结点位置 4.从上到下过滤结点 heap->Data[heap->size]待比较元素 过滤结点的具体操作 4.1 parent*2<=heap->size//判别
二叉树
实现堆
利用
二叉树
实现堆1. 堆的定义2. 如何利用
二叉树
实现堆性质==堆的实现==:以上是实现过程中自己实现的排序和交换代码。分开更容易理解。总结: 1. 堆的定义 2. 如何利用
二叉树
实现堆 堆的定义:如果有
一个
关键码的集合K = { , , ,…, },把它的所有元素按完全
二叉树
的顺序存储方式存储在
一个
一维数组中,并满足: <= 且 <= ( >= 且 >= ) i = 0,1,2…,则称为小堆(或大堆)。将根节点最大的堆叫做
最大堆
或大根堆,根节点最小的堆叫做最小堆或小根堆。 性质
C语言
69,371
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章