数据结构- 哈夫曼树的简单例子

由于个人读代码时常常因为代码太长,看了上面忘记下面。思考时候要将数据结构体当成一个形式。

数据结构分为结构定义和结构操作,所以我将目录分为了三个部分

数据结构是对性质的维护和使用,那么我们就要对这种性质进行简单的描述。

他是最短路径的一种,二叉树具有最小路径长度的性质,但不全是二叉树。他通常会将大的权放在上面。

对于内容就不写了。主要是这个打图不方便。等以后有空了学一下那个软件。

下面代码的表头

#include <stdio.h>
#include <stdlib.h>

1.结构定义

//定义哈夫曼树结点

// 定义哈夫曼树结点
typedef struct TreeNode {
    int weight; // 权值
    struct TreeNode *left; // 左子树
    struct TreeNode *right; // 右子树
} TreeNode;

//定义哈夫曼树结构体

// 定义哈夫曼树结构体
typedef struct {
    int size; // 结点数
    TreeNode **nodes; // 结点数组
} HuffmanTree;

2.结构操作

// 创建哈夫曼树结点

// 创建哈夫曼树结点
TreeNode *createTreeNode(int weight) {
    TreeNode *node = (TreeNode *)malloc(sizeof(TreeNode));
    node->weight = weight;
    node->left = NULL;
    node->right = NULL;
    return node;
}

// 创建哈夫曼树

// 创建哈夫曼树
HuffmanTree *createHuffmanTree(int weights[], int size) {
    // 创建哈夫曼树结构体
    HuffmanTree *tree = (HuffmanTree *)malloc(sizeof(HuffmanTree));
    tree->size = size;
    tree->nodes = (TreeNode **)malloc(sizeof(TreeNode *) * size);

    // 将权值数组中的每个元素转换为哈夫曼树结点
    for (int i = 0; i < size; i++) {
        tree->nodes[i] = createTreeNode(weights[i]);
    }

    // 构建哈夫曼树
    while (tree->size > 1) {
        // 找到权值最小的两个结点
        int minIndex1 = -1, minIndex2 = -1;
        for (int i = 0; i < tree->size; i++) {
            if (minIndex1 == -1 || tree->nodes[i]->weight < tree->nodes[minIndex1]->weight) {
                minIndex2 = minIndex1;
                minIndex1 = i;
            } else if (minIndex2 == -1 || tree->nodes[i]->weight < tree->nodes[minIndex2]->weight) {
                minIndex2 = i;
            }
        }

        // 创建新结点,将权值最小的两个结点作为其左右子树
        TreeNode *newNode = createTreeNode(tree->nodes[minIndex1]->weight + tree->nodes[minIndex2]->weight);
        newNode->left = tree->nodes[minIndex1];
        newNode->right = tree->nodes[minIndex2];

        // 将新结点加入结点数组中,并删除原来的两个结点
        tree->nodes[minIndex1] = newNode;
        tree->nodes[minIndex2] = tree->nodes[tree->size - 1];
        tree->size--;
    }

    return tree;
}

// 遍历哈夫曼树

// 遍历哈夫曼树
void traverseHuffmanTree(TreeNode *node, int depth) {
    if (node == NULL) {
        return;
    }

    // 打印结点权值和深度
    printf("weight: %d, depth: %d\n", node->weight, depth);

    // 递归遍历左右子树
    traverseHuffmanTree(node->left, depth + 1);
    traverseHuffmanTree(node->right, depth + 1);
}

3.主函数

int main() {
    int weights[] = {5, 3, 8, 2, 9};
    int size = sizeof(weights) / sizeof(int);

    // 创建哈夫曼树
    HuffmanTree *tree = createHuffmanTree(weights, size);

    // 遍历哈夫曼树
    traverseHuffmanTree(tree->nodes[0], 0);

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值