首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

数据结构与算法,该如何处理

2013-04-26 
数据结构与算法已知关键字序列(K1,K2,K3,...,Kn-1)是大顶堆,试写一个算法将(K1,K2,K3,...,Kn-1,Kn)调整为

数据结构与算法
已知关键字序列(K1,K2,K3,...,Kn-1)是大顶堆,试写一个算法将(K1,K2,K3,...,Kn-1,Kn)调整为大顶堆。
[解决办法]
从后向前调整每一个非叶子节点(子堆)
对于一个节点数为n的完全二叉树(二叉堆是一棵完全二叉树),叶子节点数目为n/2上取整

于是就从[n/2]下取整那个节点向前调整,方法如下:

因为在调整当前堆时,堆顶元素(树根)的两个孩子(子堆)已经满足堆的性质,此时只有堆顶元素可能违反堆的性质,所以只需要向下调整堆顶元素(当前处理到的非叶结点)到合适的位置(一趟循环)

重复调整至第一个节点就完成了

建堆的方法,里面的子方法为堆的维护方法,只处理堆顶元素违反堆性质的情况
[解决办法]
int temp;
for(int i=n;i>1;i=i/2)
{
    if(K[i]>K[i/2])
    {
          temp=K[i]:
          K[i]=K[i/2];
          K[i/2]=temp;
     }
}
[解决办法]
这个知道堆的定义就知道怎么做了。。。。

热点排行
Bad Request.