zoukankan      html  css  js  c++  java
  • 二叉树5(哈夫曼树)

    哈夫曼树

    1.题目描述:

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

    输入:

    输入有多组数据。每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不  超过100,2<=n<=1000)。

    输出:

    输出权值。

    样例输入:

    1 2 2 5 9

    样例输出:

    37

    #include"iostream"
    using namespace std;
    
    class Tree{
    public:
        int weight;
        int left,right,parent;
        Tree(int w = 0){
            weight = w;
            left = 0;
            parent = 0;
            right = 0;
        }
        void select(Tree *HT,int n,int &i1,int &i2){
            for(int i = 1;i <= n;i++){
                if(!HT[i].parent){
                    i1 = i;
                    break;
                }
            }
            for(i = 1;i <= n;i++){
                if(!HT[i].parent && HT[i1].weight > HT[i].weight){
                    i1 = i;
                }
            }
            for(i = 1;i <= n;i++){
                if(!HT[i].parent && i != i1){
                    i2 = i;
                    break;
                }
            }
            for(i = 1;i <= n;i++){
                if(!HT[i].parent && i != i1 && HT[i2].weight > HT[i].weight){
                    i2 = i;
                }
            }
        }
        void cinCreate(Tree* &HT,int n){
            //初始化
            HT = new Tree[2 * n];
            for(int i = 1;i <= n;i++){
                cin>>HT[i].weight;
            }
            int m = 2 * n - 1;        //结点个数
            //创建哈夫曼树
            for(i = n + 1;i <= m;i++){
                Tree *newt = new Tree;
                int i1 = 1,i2 = 1;
                select(HT,i - 1,i1,i2);
                cout<<i1<<ends<<i2<<endl;
                HT[i1].parent = i;
                HT[i2].parent = i;
                HT[i].left = i1;
                HT[i].right = i2;    
                HT[i].weight = HT[i1].weight + HT[i2].weight;
            }
        }
        void showx(Tree *HT,int n,int &sum,int f = 0){
            if(n){
                if(!HT[n].left && !HT[n].right){
                    sum += f * HT[n].weight;
                }
                showx(HT,HT[n].left,sum,f + 1);
                showx(HT,HT[n].right,sum,f + 1);
                
            }
        }
    };
    int main(){
        Tree *t = NULL,*HT = NULL;
        int n = 5;
        cin>>n;
        t->cinCreate(HT,n);
        int sum = 0;
        t->showx(HT,2 * n - 1,sum);
        cout<<sum<<endl;
        return 0;
    }
    
    /*
    5  
    1 2 2 5 9
    */
  • 相关阅读:
    D3DPT_TRIANGLESTRIP 与 D3DPT_TRIANGLEFAN 的区别
    [转]DrawPrimitive 详解Direct3DDevice8
    sublime useful packages
    spring+freemarker 乱码解决办法
    vim 更改注释颜色
    git rollback
    从源码导入到github
    Laravel 安装
    Install Apache 2.2.15, MySQL 5.5.34 & PHP 5.5.4 on RHEL/CentOS 6.4/5.9 & Fedora 19-12 [转]
    Linux / Unix Command: rz
  • 原文地址:https://www.cnblogs.com/oleolema/p/9028922.html
Copyright © 2011-2022 走看看