huffman Tree c++实现

本文介绍了一种构建霍夫曼树的方法,通过不断合并最小频率的节点来构造一棵霍夫曼树。该过程使用了向量存储节点,并通过迭代方式找到未使用的最小两个节点进行合并。
my Code
  1// huffmanTree.cpp : Defines the entry point for the console application.
  2//
  3
  4#include "stdafx.h"
  5#include <algorithm>
  6#include <iostream>
  7#include <vector>
  8#include <string>
  9using namespace std;
 10
 11class huffNode 
 12{
 13public
 14    int number;
 15    huffNode *Left;
 16    huffNode *Right;
 17    bool flag; //true, means original number; false, for new ones
 18    huffNode( int n, bool bFlag=true ) : number(n), flag(bFlag){Left=NULL; Right=NULL; used=false;strU="";}
 19    huffNode(){huffNode(0);}
 20    string strU;
 21    bool used;
 22
 23}
;
 24bool hCompare(const huffNode & m1, const huffNode & m2) {
 25    return m1.number<m2.number;}

 26
 27//int uu;
 34
 35int _tmain(int argc, _TCHAR* argv[])
 36{
 37
 38    int n=10;
 39    vector < huffNode > vect;
 40    for ( int i=0; i<n; i++)
 41    {
 42        vect.push_back( huffNode( i) );
 43    }

 44
 45    huffNode * f1; //= &vect[0];
 46    huffNode * f2; //= &vect[1];
 47    huffNode * f0;
 48    huffNode * tempF;
 49     int temp=0;
 50
 51 
 52    for ( int i=0; i < n-1; i++)
 53    {
 54        //sort( vect.begin(), vect.end(), hCompare );
 55        //f1 = & vect[0];
 56        int temp=0;
 57        for ( int t=0; t<n+i; t++
 58        {    
 59            tempF = &vect[t];
 60            
 61            if (tempF->used != true)
 62            {
 63                if (temp==0)
 64                {
 65                    f1 = & vect[t];
 66                    f1->used = true;
 67                    temp++;
 68                }

 69                else if (tempF->number<=f1->number)
 70                {
 71                    f1->used = false;
 72                    f1 = & vect[t];
 73                    f1->used = true;
 74                }

 75            }

 76        }

 77        temp=0;
 78        for ( int t=0; t<n+i; t++
 79        {    
 80            tempF = &vect[t];
 81            if (tempF->used != true)
 82            {
 83                if (temp==0)
 84                {
 85                    f2 = & vect[t];
 86                    f2->used = true;
 87                    temp++;
 88                }

 89                else if (tempF->number<=f2->number)
 90                {
 91                    f2->used = false;
 92                    f2 = & vect[t];
 93                    f2->used = true;
 94                }

 95            }

 96        }

 97
 98         
 99        f0 = &huffNode( f1->number + f2->number, false);
100        if ( f1->flag != false)
101        {
102            f0->Left = f2;
103            f0->Right = f1;
104        }

105        else
106        {
107            f0->Left = f1;
108            f0->Right = f2;
109        }

110         cout <<" f1: " << f1->number;
111        if (f1->Left==NULL)
112        {
113            cout<<"*";
114        }

115        cout<< " f2: "<< f2->number;
116        if (f2->Left==NULL)
117        {
118            cout<<"*";
119        }

120        cout<< endl;        
121        vect.push_back( *f0 );
122
123
124     }

125
126
127
128    return 0;
129}

130
131

转载于:https://www.cnblogs.com/zjulion/archive/2008/03/03/1089339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值