C++ huffman树的创建和打印
来源:互联网 发布:20元假币淘宝号 编辑:程序博客网 时间:2024/06/05 18:50
最近写了huffman树的代码,写在这里记录下来
在写huffman树过程中,我认为难点在于找出权值最小的两棵子树,即函数SeleteMin(int &x, int &y,int s,int e ):
在该函数中先遍历找出第一个有效权值,即他的父节点值为-1,并把他的序号赋给x,y,退出;
再继续遍历,遇到父节点值为-1:
如果i权值比x权值小,则y=x,x=i;
再如果i权值比y小或者x=y时,则y=i;
又由于我在函数参数上使用了引用便不用返回值了,直接改变了xy的值。
源代码:
#include "stdafx.h"#include<iostream>#include<iomanip>using namespace std;#define N 10struct node{int parent, lchild, rchild;int weight;};class Huffman{public:Huffman();~Huffman();void createhuffman();void seleteMin(int &x, int &y,int s,int e );int get();void print();void printl(int a, int m);private:int n;int a[256];node *Hnode;};Huffman::Huffman(){}Huffman::~Huffman(){delete []Hnode;}
//创建huffman树void Huffman::createhuffman(){Hnode = new node[2*n-1];for (int i = 0; i < 2*n-1; i++){Hnode[i].lchild = -1;Hnode[i].rchild = -1;Hnode[i].parent = -1;}for (int i = 0; i < n; i++){Hnode[i].weight = a[i];}int x, y;for (int k = n; k < 2*n-1; k++){seleteMin(x, y, 0, k);cout << "输出x,y,k:";cout << x << y <<k<< endl;cout << " " << endl;Hnode[x].parent = k;Hnode[y].parent = k;Hnode[k].weight = Hnode[x].weight + Hnode[y].weight;Hnode[k].lchild = x;Hnode[k].rchild = y;}}//找出权值最小的两棵树void Huffman::seleteMin(int &x, int &y, int s, int e){int i;for (i = s; i < e; i++){if (Hnode[i].parent == -1)//找出第一个有效权值x,并令y=x{x = y = i;cout << "一开始x的值:" << x <<" "<< Hnode[x].weight << endl;break;}}cout << "输出i:" << i << endl;for (; i < e;i++){if (Hnode[i].parent == -1)//该权值未使用过{if (Hnode[i].weight < Hnode[x].weight){y = x;x = i;}else if (x == y || Hnode[i].weight < Hnode[y].weight){y = i;//找第二个有效权值y}}}}int Huffman::get(){cin >> n;for (int i = 0; i < n; i++){cin >> a[i];}return n;}//输出测试void Huffman::print(){for (int i = 0; i < 2*n-1; i++){cout << a[i] << " ";cout << Hnode[i].weight <<" "<<Hnode[i].parent<< endl;}}//打印huffman树void Huffman::printl(int b, int m){if (Hnode[b].lchild==-1){cout << setfill(' ') << setw(m + 1) << a[b] << setfill('*') << setw(N - m) << endl;}else{cout << setfill(' ') << setw(m + 1) << Hnode[b].weight << setfill('*') << setw(N - m) << endl;printl(Hnode[b].lchild, m + 1);printl(Hnode[b].rchild, m + 1);}}int _tmain(int argc, _TCHAR* argv[]){Huffman Htree;cout << "输入n,和n个数" << endl;int t=Htree.get();Htree.createhuffman();Htree.print();Htree.printl(2 * t- 2, 1);system("pause");return 0;}
0 0
- C++ huffman树的创建和打印
- Huffman树的创建
- Huffman树的创建
- 【C++】Huffman树的实现
- huffman树的创建与编码
- Huffman树的创建及编码
- huffman树和huffman编码
- huffman树和huffman编码
- Huffman树和Huffman编码
- java huffman树的构造和huffman编码
- 创建huffman树
- huffman树( c++) 的三种实现
- Huffman树和编码
- [c] 单链表创建,打印和反转
- 二叉树的创建、打印、删除等函数(c)
- C++Huffman树的构造实现及编码译码过程
- Huffman树的实现
- huffman树的编译
- hadoop2.2.0双namenode配置文件配置(高可靠性HA)
- win10系统下谷歌浏览器web移动端看不到小圆点解决方案
- 数据结构(郝斌)
- 关于ssh公钥认证的一些看法
- windows 下安装 python lxml
- C++ huffman树的创建和打印
- 【Hibernate】(八)关联映射之多对多映射
- MySQL查询语句练习题(面试时可能会遇到哦!)
- 三大自定义控件
- 顶尖程序员与普通程序员的5个区别
- ubuntu software database is broken错误解决办法
- SQL注入攻击及危害
- 解决数据库实例启动ORA-00205问题
- Path Sum问题及解法