如何建立一个二叉树最大堆.

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

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧