鱼C论坛

 找回密码
 立即注册
查看: 3443|回复: 3

哈夫曼树编程

[复制链接]
发表于 2019-3-20 18:29:11 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
给出n个叶子结点的权重,求一个二叉树,使得其带权路径长度最小,实际上就是哈夫曼树。输出其最小的路径长度。
样例:
输入:
3
1 2 3
4
1 1 1 1
0
其中第一行是叶子结点个数,第二行是叶子结点的权重
0标志结束,不做处理
输出:
9
8

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-20 18:30:37 From FishC Mobile | 显示全部楼层
c语言编程最好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 19:39:56 | 显示全部楼层
#include <stdio.h>
#include <string.h>

#define MAX_ARR_SIZE 256 

struct SortArr {
        int arr[MAX_ARR_SIZE];
        int size;
};

struct SortArr CreateSortArr(int* arr0, int size) {
        struct SortArr arr;
        arr.size = size;
        memcpy(arr.arr, arr0, size * sizeof(int));
        int i, j;
        for (i = 0; i < size - 1; ++i)
        for (j = i; j < size - 1; ++j) {
                if (arr.arr[j] > arr.arr[j + 1]) {
                        int tmp = arr.arr[j];
                        arr.arr[j] = arr.arr[j + 1];
                        arr.arr[j + 1] = tmp;
                }
        }
        return arr;
}

void sortarr_insert(struct SortArr* arr,int num) {
        int p = 0;
        int q = arr->size;
        while (p < q) {
                int n = (p + q) / 2;
                if (num >= arr->arr[n]) p = n + 1;
                else q = n;
        }

        int i;
        for (i = arr->size; i > q; --i) {
                arr->arr[i] = arr->arr[i - 1];
        }
        arr->arr[q] = num;
        arr->size++;
}

void sortarr_erase(struct SortArr* arr,int i) {
        for (i; i < arr->size - 1; ++i) {
                arr->arr[i] = arr->arr[i + 1];
        }
        arr->size--;
}


int GetSum(int* arr0, int N) {
        struct SortArr arr=CreateSortArr(arr0,N);

        int sum = 0;
        while (arr.size > 1) {
                int a = arr.arr[0]+arr.arr[1];
                sortarr_erase(&arr,0);
                sortarr_erase(&arr,0);
                sortarr_insert(&arr,a);
                sum += a;
        }
        return sum;
}

int main() {
        int ans[MAX_ARR_SIZE];
        int N = 0;
        do {
                int arr[MAX_ARR_SIZE];
                int arr_size;
                scanf("%d", &arr_size);
                if (arr_size <= 0) break;
                int i;
                for (i = 0; i < arr_size; ++i) {
                        scanf("%d", arr + i);
                }
                ans[N++] = GetSum(arr, arr_size);
        } while (1);

        int i;
        for (i = 0; i < N; ++i) {
                printf("%d\n", ans[i]);
        }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 21:27:15 | 显示全部楼层
过来学习大佬操作
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-3 12:35

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表