Node:最小堆

#include <iostream>
#include <stdlib.h>
#include <ctime>

using namespace std;

const int maxn=1010;
int heap[maxn];
int sz;

//堆从下标1开始
void deleteNode()         //最小堆
{
    //,第一个节点删除,最后一个放到第一个位置,之后向下调整
    heap[1] = heap[sz--];
    int cur = 1, son = 2;
    //  存在儿子比父亲小
    while(son <= sz && (heap[son] < heap[cur] || heap[son+1] < heap[cur]))
    {
        if(heap[son] > heap[son+1])
            son++;
        swap(heap[son],heap[cur]);

        //指针下移
        cur = son;
        son*= 2;
    }
}

void insertNode(int t)
{
    //添加到最后一个节点,向上调整
    heap[++sz] = t;
    int cur = sz, p = cur/2;
    while(p>=1)
    {
        //比父亲小的节点
        if(heap[cur] < heap[p])
            swap(heap[cur],heap[p]);
        cur = p;
        p = cur/2;
    }
}

int main()
{
    int n,t;
    srand(time(0));
    while(cin>>n)
    {
        sz=0;
        for(int i=1;i<=n;i++)
        {
            t=rand()%1000;
            insertNode(t);
            //cout<<heap[1]<<endl;
        }
        for(int i=1;i<=n;i++)
        {
            if(!n%10)
                cout<<endl;
            cout<<heap[1]<<" ";
            deleteNode();
        }
        cout<<endl;
    }

    return 0;
}

最小堆是一种特殊的二叉,它满足以下性质: 1. 每个节点的值都小于或等于其子节点的值。 2. 中的最小元素位于根节点。 哈夫曼树是一种用于数据压缩的树形结构,它通过将出现频率较高的字符编码为较短的二进制码,从而实现数据的高效压缩。构建哈夫曼树的过程中,需要使用最小堆来选择频率最低的两个节点进行合并。 下面是使用C语言实现最小堆构建哈夫曼树的基本步骤: 1. 定义一个结构体来表示树节点,包括字符、频率和左右子节点等信息。 ```c struct Node { char data; int freq; struct Node* left; struct Node* right; }; ``` 2. 创建一个最小堆,并初始化为空。 ```c struct MinHeap { int size; int capacity; struct Node** array; }; ``` 3. 实现最小堆的一些基本操作,如交换节点、调整节点位置等。 ```c void swapNode(struct Node** a, struct Node** b); void minHeapify(struct MinHeap* minHeap, int index); struct Node* extractMin(struct MinHeap* minHeap); void insertMinHeap(struct MinHeap* minHeap, struct Node* node); ``` 4. 构建最小堆,将每个字符的频率作为节点的值,并插入到最小堆中。 ```c struct MinHeap* createAndBuildMinHeap(char data[], int freq[], int size); ``` 5. 构建哈夫曼树,不断从最小堆中取出频率最低的两个节点,合并为一个新节点,并将新节点插入到最小堆中,直到最小堆中只剩下一个节点为止。 ```c struct Node* buildHuffmanTree(char data[], int freq[], int size); ``` 6. 打印哈夫曼树的编码,通过遍历哈夫曼树的路径来获取每个字符的编码。 ```c void printCodes(struct Node* root, int arr[], int top); ``` 这是一个简单的介绍,如果你需要更详细的代码实现或者有其他问题,请告诉我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值