数据结构与算法
已知关键字序列(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;
}
}
[解决办法]
这个知道堆的定义就知道怎么做了。。。。