数组模拟实现二叉堆——(为以后的链表实现二叉堆打基础) _清风明月

先开始抛出自己的测试数据啦。

9

344 23 5 6 45 3 7 89 1

3

First:

(最优二叉树,哈弗曼树)

先把最小的两个选出来,然后让它们的和成为根节点的值,生成一棵新树,放进去。再与最小的形成一个新的。如此递归。所有的非叶子结点的值加起来是最终结果。


 二叉堆分为:最大堆(根节点大于左右,//左右加起来等于根节点)和最小堆。

Second

扫描二维码关注公众号,回复: 9372080 查看本文章

最大堆:建堆过程:第一个进来的数为根节点,第二个为左儿子,……;

数组存储。左:i*2,右:i*2+1(从1开始存储。)//左儿子右儿子还可以使用左移运算符,右移运算符;>>,<<来进行表示。


向上调整:然后如果要插入一个数进堆的话,首先加入到最后一个位置。然后看最大堆的父亲节点,与父亲节点进行对比大小。

向下调整:【此处头结点只是一个我列举出来的例子】

删除——删除节点(头结点):把最后一个元素的值放在该删除节点(头结点)上,因为不能没有根。依次按最大堆的定义下放原最后元素。


//2i>总的节点数。

堆排序:

构建堆;

从小到大排:根节点与最后一个元素交换。

下去看哈弗曼树和二叉树的时间复杂度:



#include<iostream>

#include<algorithm>
#include<cstdio>
using namespace std;
const int maxf = 1e6 + 1;
int T[4 * maxf];
int size = 0, sizetrue = 0;
void push_up()//T[size]
{
while (size > 1)
{
if (T[size] < T[size / 2] )
return;
if (T[size] >= T[size / 2])
{
int t;
t = T[size];
T[size] = T[size / 2];
T[size / 2] = t;
size = size / 2;
}
}
}
void insertbuild(int elem)
{
++sizetrue;
if (sizetrue == 1)
T[sizetrue] = elem;//1 is root,2 is lson,3 is rson
else
{
T[sizetrue] = elem;
size = sizetrue;
push_up(); //如果要插入一个数进堆的话,首先加入到最后一个位置。然后看最大堆的父亲节点,与父亲节点进行对比大小。
}
}
void push_down()
{
while (size < sizetrue)
{
if (T[size] <= max(T[size * 2], T[size * 2 + 1]))
{
int t;
t = T[size];
T[size] = max(T[size * 2], T[size * 2 + 1]);
T[size * 2] >= T[size * 2 + 1] ? (T[size * 2] = t, size = size * 2) : (T[size * 2 + 1] = t, size = size * 2 + 1);
}
else
break;
}
}
void remove(int index)//向下调整:删除——删除节点(头结点):把最后一个元素的值放在该删除节点(头结点)上,因为不能没有根。依次按最大堆的定义下放原最后元素。
{
size = index;
T[index] = T[sizetrue];
push_down();
--sizetrue;
}
void print()
{
cout << "进入print函数" << endl;
int i;
cout << sizetrue << endl;
for (i = 1; i <= sizetrue ; ++i)
cout << T[i] << " " ;
cout << endl;
}
int main()
{
int i, n;
cin >> n;
int elem;
for (i = 1; i <= n; ++i)
{
cin >> elem;
insertbuild(elem);
}
print();
int index;
cin >> index;
remove(index);
print();
return 0;
}

发布了39 篇原创文章 · 获赞 16 · 访问量 3165

猜你喜欢

转载自blog.csdn.net/HDZ1821/article/details/78369960
今日推荐