1. 程式人生 > 其它 >演算法與資料結構 實驗三 二叉樹及其應用

演算法與資料結構 實驗三 二叉樹及其應用

實驗專案名稱:實驗 二叉樹及其應用         

一、 實驗目的
1.掌握二叉樹的定義;
2.掌握哈夫曼樹和哈夫曼編碼演算法的實現。

二、 實驗內容

7-1 哈夫曼樹哈夫曼編碼

輸入一組整型權值,構建哈夫曼樹,實現哈夫曼編碼,並輸出帶權路徑長度。

輸入格式:

第一行輸入葉子結點個數,接著依次輸入權值。

輸出格式:

輸出哈夫曼編碼,輸出帶權路徑長度。

輸入樣例:

在這裡給出一組輸入。例如:

8

5 29 7 8 14 23 3 11

輸出樣例:

在這裡給出相應的輸出。例如:

5編碼為0001

29編碼為10

7編碼為1110

8編碼為1111

14編碼為110

23編碼為01

3編碼為0000

11編碼為001

WPL:271

三、 設計文件

 

四、 源程式

#include<iostream>

#include<cstdio>

using namespace std;

const int N=100010;

struct node{

    int num,fa,ch;

};

bool st[N];

int n;

node* nodes;

int find(int n){

    int p=0;

    for(int i=1;i<=n;i++){

        if(st[i]==0&&(p==0||nodes[i].num<nodes[p].num)){

            p=i;

        }

    }

    return p;

}

void add(int lc,int rc,int p){

    nodes[lc].fa=p;

    nodes[lc].ch=-1;

    nodes[rc].fa=p;

    nodes[rc].ch=1;

    nodes[p].num=nodes[lc].num+nodes[rc].num;

}

string huffman(int k){

    string s;

    if(nodes[k].fa){

        s=huffman(nodes[k].fa);

    }

    if(nodes[k].ch){

        s+=nodes[k].ch==-1?"0":"1";

    }

    return s;

}

int main(){

    cin>>n;

    nodes=new node[2*n];

    for(int i=1;i<=n;i++){

        cin>>nodes[i].num;

    }

    if(n==1||n==0){

        cout<<"error";

    }else{

        int l=n+1,r=2*n-1;

        while(l<=r){

            int c1=find(l-1);

            st[c1]=1;

            int c2=find(l-1);

            st[c2]=1;

            add(c1,c2,l++);

        }

        int wpl=0;

        for(int i=1;i<=n;i++){

            string s=huffman(i);

            cout<<nodes[i].num<<"編碼為"<<s<<endl;

            wpl+=nodes[i].num*s.size();

        }

        cout<<"WPL:"<<wpl;

    }

    return 0;

}