• 九度 1172:哈夫曼树


    题目描述:

    哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和

    思路

    1. 构建哈夫曼树然后 topDown 遍历即可

    2. 也可以不显式的创建树. 所有树叶点的和即为所求(根节点以外)

    代码 STL priority_queue 自定类型不会用

    #include <iostream>
    #include <stdio.h>
    #include <queue>
    using namespace std;
    
    class Node {
    public:
        int value;
        Node *left, *right;
    
        Node(int _value) {
            value = _value;
        } 
        Node() {
            Node(0);
        }
        bool operator<(const Node &ths) const {
            return this->value < ths.value;
        }
    };
    
    int n;
    int res;
    
    void calculate(Node *root, int depth) {
        if(root->left == NULL && root->right == NULL) {
            res += root->value*depth;
            return;
        }
        calculate(root->left, depth+1);
        calculate(root->right, depth+1);
    }
    
    int main() {
        freopen("testcase.txt", "r", stdin);
        while(scanf("%d", &n) != EOF) {
            res = 0;
            priority_queue<Node*> record;
    
            int val;
            for(int i = 0; i < n; i ++) {
                scanf("%d", &val);
                record.push(new Node(val));
            }
    
            while(record.size() != 1) {
                Node *node1 = record.top();
                record.pop();
                Node *node2 = record.top();
                record.pop();
    
                Node *newNode = new Node(node1->value + node2->value);
                newNode->left = node1;
                newNode->right = node2;
                record.push(newNode);
            }
    
            calculate(record.top(), 0);
    
            cout << res << endl;
        }
        return 0;
    }
  • 相关阅读:
    从头学Android之Android布局管理:LinerLayout线性布局
    Android onTouch事件传递机制
    android开源项目和框架
    <hdu
    <hdu
    <poj
    <poj
    <hdu
    <hdu
    <hdu
  • 原文地址:https://www.cnblogs.com/xinsheng/p/3592375.html
Copyright © 2020-2023  润新知