哈夫曼树编程
给出n个叶子结点的权重,求一个二叉树,使得其带权路径长度最小,实际上就是哈夫曼树。输出其最小的路径长度。样例:
输入:
3
1 2 3
4
1 1 1 1
0
其中第一行是叶子结点个数,第二行是叶子结点的权重
0标志结束,不做处理
输出:
9
8
c语言编程最好 #include <stdio.h>
#include <string.h>
#define MAX_ARR_SIZE 256
struct SortArr {
int arr;
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 > arr.arr) {
int tmp = arr.arr;
arr.arr = arr.arr;
arr.arr = 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) p = n + 1;
else q = n;
}
int i;
for (i = arr->size; i > q; --i) {
arr->arr = arr->arr;
}
arr->arr = num;
arr->size++;
}
void sortarr_erase(struct SortArr* arr,int i) {
for (i; i < arr->size - 1; ++i) {
arr->arr = arr->arr;
}
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+arr.arr;
sortarr_erase(&arr,0);
sortarr_erase(&arr,0);
sortarr_insert(&arr,a);
sum += a;
}
return sum;
}
int main() {
int ans;
int N = 0;
do {
int arr;
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 = GetSum(arr, arr_size);
} while (1);
int i;
for (i = 0; i < N; ++i) {
printf("%d\n", ans);
}
} 过来学习大佬操作
页:
[1]