鱼C论坛

 找回密码
 立即注册
查看: 4074|回复: 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

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-20 18:30:37 From FishC Mobile | 显示全部楼层
c语言编程最好
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

  3. #define MAX_ARR_SIZE 256

  4. struct SortArr {
  5.         int arr[MAX_ARR_SIZE];
  6.         int size;
  7. };

  8. struct SortArr CreateSortArr(int* arr0, int size) {
  9.         struct SortArr arr;
  10.         arr.size = size;
  11.         memcpy(arr.arr, arr0, size * sizeof(int));
  12.         int i, j;
  13.         for (i = 0; i < size - 1; ++i)
  14.         for (j = i; j < size - 1; ++j) {
  15.                 if (arr.arr[j] > arr.arr[j + 1]) {
  16.                         int tmp = arr.arr[j];
  17.                         arr.arr[j] = arr.arr[j + 1];
  18.                         arr.arr[j + 1] = tmp;
  19.                 }
  20.         }
  21.         return arr;
  22. }

  23. void sortarr_insert(struct SortArr* arr,int num) {
  24.         int p = 0;
  25.         int q = arr->size;
  26.         while (p < q) {
  27.                 int n = (p + q) / 2;
  28.                 if (num >= arr->arr[n]) p = n + 1;
  29.                 else q = n;
  30.         }

  31.         int i;
  32.         for (i = arr->size; i > q; --i) {
  33.                 arr->arr[i] = arr->arr[i - 1];
  34.         }
  35.         arr->arr[q] = num;
  36.         arr->size++;
  37. }

  38. void sortarr_erase(struct SortArr* arr,int i) {
  39.         for (i; i < arr->size - 1; ++i) {
  40.                 arr->arr[i] = arr->arr[i + 1];
  41.         }
  42.         arr->size--;
  43. }


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

  46.         int sum = 0;
  47.         while (arr.size > 1) {
  48.                 int a = arr.arr[0]+arr.arr[1];
  49.                 sortarr_erase(&arr,0);
  50.                 sortarr_erase(&arr,0);
  51.                 sortarr_insert(&arr,a);
  52.                 sum += a;
  53.         }
  54.         return sum;
  55. }

  56. int main() {
  57.         int ans[MAX_ARR_SIZE];
  58.         int N = 0;
  59.         do {
  60.                 int arr[MAX_ARR_SIZE];
  61.                 int arr_size;
  62.                 scanf("%d", &arr_size);
  63.                 if (arr_size <= 0) break;
  64.                 int i;
  65.                 for (i = 0; i < arr_size; ++i) {
  66.                         scanf("%d", arr + i);
  67.                 }
  68.                 ans[N++] = GetSum(arr, arr_size);
  69.         } while (1);

  70.         int i;
  71.         for (i = 0; i < N; ++i) {
  72.                 printf("%d\n", ans[i]);
  73.         }
  74. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-3-20 21:27:15 | 显示全部楼层
过来学习大佬操作
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-3 03:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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