生成最优归并树

来源:互联网 发布:淘宝减肥药销量排行榜 编辑:程序博客网 时间:2024/05/16 04:58

算法连载(3)--生成最优归并树

分类: 开发/管理 1046人阅读 评论(0) 收藏 举报
算法treestructclassjoin

1.问题描述:把N个已分类的文件通过成对地重复归并已分类的文件归并在一个文件中。例如,假定X1,X2,X3,X4是要归并的文件,则可以首先把X1,X2归并成Y1,然后Y1和X3归并成Y2,最后Y2和X4归并,从而得到要的分类文件。运用最优二路归并方法,归并出来的结果都有想对应的最小权带外部路径的二元树,所以把问题转换为由N棵根结点带权值的树组成的森林,归并成为一棵二元树。

2.设计思想与分析:
    基本思路:(1)假设给定的一组权值{W1,W2,……,Wn},由此可以产生出由N棵二元树组成的森林F={T1,T2,……,Tn},其中每棵树都有一个权值为Wi的根结点;(2)在森林F中选出两棵树根结点的权值最小的树,作为一棵新树的左右子树且置新树的根结点的权值为其左右子树的根结点的权值之和;(3)从森林F中删去分别做为左右子树的这两棵树,同时将新树加入到集合F中;(4)对新的森林重复2,3步骤,直到F中只剩一棵二元树时为止,这就是所要的树了。

#include "iostream.h"
struct HuffmanNode { int weight;  int parent;  int lchild,rchild;};////////////////////////////////structure of node///////////////////////////////////////////////////
class HuffmanTree  {public: HuffmanNode *Node;
public:Tree(int weightnum);
};////////////////////////////////huaffmantree class////////////////////////////////////////////////////
HuffmanTree::Tree(int weightnum){   int i , j, pos1,pos2;  int min1,min2;   Node=new struct HuffmanNode [2*weightnum-1]; for (i=0;i<weightnum;i++) {   cout<<"请输入第"<<i+1<<"个字符的权值:";  cin>>Node[i].weight;  Node[i].parent=-1;     Node[i].lchild=-1;    Node[i].rchild=-1;   }/////////////////////*join and creat tree*/////////////// for (i=weightnum; i<2*weightnum-1; i++) {  pos1=-1;  pos2=-1;  min1=min2=32762;  j=0;  while(j<=i-1)  {   if (Node[j].parent==-1)   {    if(Node[j].weight<=min1)    {  min2=min1; min1=Node[j].weight;              pos2=pos1; pos1=j; }    else     if(Node[j].weight<min2)     { min2=Node[j].weight; pos2=j; }   }   j++;     }//while   Node[pos1].parent=i;   Node[pos2].parent=i;   Node[i].lchild=pos1;   Node[i].rchild=pos2;   Node[i].parent=-1;      Node[i].weight=Node[pos1].weight+Node[pos2].weight; }//for j=2*weightnum-2; int l,r;
while(Node[j].lchild!=-1||Node[j].rchild!=-1){ cout<<"root is:"<<Node[j].weight<<" "; l=Node[j].lchild; r=Node[j].rchild; cout<<"lchild is:"<<Node[l].weight<<" "; cout<<"rchild is:"<<Node[r].weight<<" "; cout<<endl; j--;}
} //////////////////////////////////creat a Btree///////////////////////////////////////////////
void  main(){ cout<<"|--------生成最优的二元归并树---------|"<<endl; cout<<"|---power by zhanjiantao(028054115)---|"<<endl; cout<<"|-------------------------------------|"<<endl; int i; while(i) { int weightnum; cout<<"请输入权值的个数: "; cin>>weightnum; HuffmanTree t; t.Tree(weightnum); cout<<"Press<1> to run again"<<endl; cout<<"Press<0> to exit"<<endl; cin>>i; }}
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 网赌账号被冻结怎么办 梦想城镇账号被冻结怎么办 钱被银行冻结了怎么办 百度云账号密码忘了怎么办 微信钱包忘记密码了怎么办 word文档打开文件出错怎么办 有盘文件删不了怎么办 u盘文档严重损坏怎么办 wps文档打开是乱码怎么办 九游3083网资金冻结怎么办 阴阳师九游版禁止部分玩法怎么办 夜神模拟器游戏打不开怎么办 九游代金券锁定怎么办 被娱乐天地骗了怎么办 win8更新失败无法开机怎么办 安装英雄联盟文件损坏怎么办 电脑玩lol运行内存不足怎么办 守望先锋账号冻结了怎么办 守望先锋服务器发生意外错误怎么办 在先锋社保缺一年上学怎么办 lol更新后反应很慢怎么办 电脑跳舞毯不正常电脑游戏怎么办 PS中缺失的字体怎么办 黑板墙不想要了怎么办 淘宝代练打坏了怎么办 绝地求生与ipad不兼容怎么办 小米手机玩绝地求生卡怎么办 绝地求生服务器目前非常繁忙怎么办 玩绝地求生手机发烫怎么办 绝地求生刺激战场延迟高怎么办 怀孕八个半月打喷嚏头疼怎么办 20岁打喷嚏漏尿怎么办 鼻炎犯了不停打喷嚏怎么办 鼻炎犯了不停打喷嚏流鼻涕怎么办 感冒鼻痒怎么办小窍门 腰扭了屁股也疼怎么办 小三把房子过户怎么办 小三把房子卖了怎么办 打印机ip地址变了怎么办 电脑ip地址错误不能上网怎么办 修改了注册表电脑无法启动怎么办