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
原创粉丝点击