哈夫曼树树状输出

  1 #include "stdio.h"
  2 #include "malloc.h"
  3
  4 #define  maxlen 100
  5 #define infinity 65535
  6
  7 struct bnode
  8 {
  9     int data;//数据
 10     bnode *lchild,*rchild;
 11     bool flags;//使用标志
 12 };
 13
 14 bnode *tree[maxlen];
 15
 16 void initialization(int A[],int N,bnode *tree[maxlen])//初始化
 17 {
 18     int i;
 19     for(i=0;i<N;i++)
 20     {
 21         tree[i] = (bnode *)malloc(sizeof bnode);//分配存储区域
 22         tree[i]->data = A[i];//结点的值
 23         tree[i]->flags = true;//标识未使用
 24         tree[i]->lchild = NULL;//左子树为空
 25         tree[i]->rchild = NULL;//右子树为空
 26     }
 27 }
 28
 29 int merge(int n,bnode *tree[maxlen])//寻找当前根结点值最小的两个子树将其合并
 30 {
 31     int i,num1,num2,min1,min2;
 32     min1 = infinity;
 33     min2 = infinity;
 34     for(i=0;i<n;i++)//寻找当前值最小的根节点
 35     {
 36         if((tree[i]->data<min1)&&tree[i]->flags)
 37         {
 38             min1 = tree[i]->data;
 39             num1 = i;
 40         }
 41     }
 42     tree[num1]->flags = false;//设置标识已使用过
 43
 44     for(i=0;i<n;i++)//寻找当前值最小的根节点
 45     {
 46         if((tree[i]->data<min2)&&tree[i]->flags)
 47         {
 48             min2 = tree[i]->data;
 49             num2 = i;
 50         }
 51     }
 52     tree[num2]->flags = false;//设置标识已使用过
 53     //将两个子树合并
 54     tree[n] =(bnode *)malloc(sizeof bnode);//分配存储区域
 55     tree[n]->data = tree[num1]->data + tree[num2]->data;
 56     tree[n]->flags = true;
 57     tree[n]->lchild = tree[num1];
 58     tree[n]->rchild = tree[num2];
 59     n++;
 60     return n;
 61 }
 62
 63 int  Huffmantree(int n,bnode *tree[maxlen])//构造哈夫曼树
 64 {
 65     int i,num;
 66     bool flags = true;//标识
 67     while(flags)
 68     {
 69         num = 0;//计数
 70         for(i=0;i<n;i++)//统计未使用结点数
 71         {
 72             if(tree[i]->flags)
 73             {
 74                 num++;
 75             }
 76         }
 77         if(num>=2)
 78         {
 79             n = merge(n,tree);//合并当前根结点值最小的两棵子树
 80         }else{
 81             flags = false;//哈夫曼树构造完成标识
 82         }
 83     }
 84     return n;
 85 }
 86
 87
 88 void PrintTree(bnode *Tree,int nlayer) //按树状打印二叉树
 89 {
 90     if(Tree==NULL)
 91     {
 92         return   ;
 93     }
 94     PrintTree( Tree->rchild,nlayer+1); //打印右子树
 95     for(int i=0;i<nlayer;i++)
 96     {
 97         printf("   ");
 98     }
 99     printf("%d  \n",Tree->data);
100     PrintTree(Tree->lchild,nlayer+1); //打印左子树
101 }
102
103 int main()
104 {
105     int x,nlayer=1;
106     int Array[maxlen];//存放节点的值
107     int count=0;//结点的个数
108     printf("[输入叶子结点,-1输入结束]:\n");
109     printf("Data:");
110     scanf("%d",&x);
111     while(x!=-1)
112     {
113         Array[count++] = x;
114         scanf("%d",&x);
115     }
116
117     initialization(Array,count,tree);//左右子树初始化
118     count = Huffmantree(count,tree);//构造哈夫曼树
119
120     printf("哈夫曼树树状输出:\n");
121
122     PrintTree(tree[count-1],nlayer);
123
124     printf("\n");
125     return 0;
126 }
时间: 2024-10-18 03:05:22

哈夫曼树树状输出的相关文章

哈夫曼 (Huffman) 树的动画演示

 哈夫曼 (Huffman) 树的动画演示: http://people.cs.pitt.edu/~kirk/cs1501/animations/Huffman.html 此网站中亦有诸多其它算法的动画演示,可供学习算法或是数据结构相关内容时参考.

哈夫曼(Huffman)树与哈夫曼编码

声明:原创作品,转载时请注明文章来自SAP师太技术博客:www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将追究法律责任!原文链接:http://www.cnblogs.com/jiangzhengjun/p/4289610.html 哈夫曼树又称最优二叉树,是一种带权路径长最短的树.树的路径长度是从树根到每一个叶子之间的路径长度之和.节点的带树路径长度为从该节点到树根之间的路径长度与该节点权(比如字符在某串中的使用频率)的乘积. 比如有一串字符串如

解一道哈夫曼编码树问题

已知字符a~f的出现频率分别是55.30.19.3.6.16,在此基础上构造Huffman树,并写出a~f的前辍编码,规定左孩子编码为0,右孩子编码为1.(6分) 现在的集合是{55,30,19,16,6,3} 先取最小的权值  即 9 /    \ 6       3 现在变成了 {55,30,19,16,9}继续取最小权值 25 /    \ 16     9 /    \ 6      3 现在变成了 {55,30,19,25} 44 /    \ 19   25 /    \ 16   

赫夫曼树编码

在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN) 树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如 JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树, 是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点 的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度 为叶结点的层数).树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln) ,

C++哈夫曼树编码和译码的实现

一.背景介绍: 给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree).哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近. 二.实现步骤: 1.构造一棵哈夫曼树 2.根据创建好的哈夫曼树创建一张哈夫曼编码表 3.输入一串哈夫曼序列,输出原始字符 三.设计思想: 1.首先要构造一棵哈夫曼树,哈夫曼树的结点结构包括权值,双亲,左右孩子:假如由n个字符来构造一棵哈夫曼树,则共有结点2n-1个:在构造前,先初始化

javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. 以下图为例: A到F :结点路径 AEF : 路径长度(即边的数目) 2 : 树的路径长度:3*1+5*2+2*3=19: ④ 结点的带权路径长度:从该结点的到树的根结

哈夫曼树和哈夫曼编码

在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树. 哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的 路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径长度记为WPL= (W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值W

数据结构 - 赫夫曼树及其应用

赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支构成这两个结点之间的路径. ② 路径长度:结点路径上的分支数目称为路径长度. ③ 树的路径长度:从树根到每一个结点的路径长度之和. ④ 结点的带权路径长度:从树的根结点到该结点的的路径长度与结点的权(值)的乘积. 权(值):各种开销.代价.频度等的抽象称呼. ⑤ 树的带权路径长度:树中所有叶子结点的带权路径长度之和,记做: WPL

哈夫曼树(最优二叉树)及哈夫曼算法

哈夫曼树 在一般的数据结构的书中,树的那章后面,著者一般都会介绍一下哈夫曼(HUFFMAN)树和哈夫曼编码.哈夫曼编码是哈夫曼树的一个应用.哈夫曼编码应用广泛,如JPEG中就应用了哈夫曼编码. 首先介绍什么是哈夫曼树.哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树.所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数).树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权

【算法总结】哈夫曼树和哈夫曼编码

一.哈夫曼树 1. 哈夫曼树也称最优二叉树. 叶子节点的权值是对叶子节点赋予的一个有意义的数值量. 设二叉树具有 n 个带权值的叶子结点,从根节点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和叫做二叉树的带权路径长度. 给定一组具有确定权值的叶子结点,可以构造处不同的二叉树,将其中带权路径长度最小的二叉树称为哈夫曼树. 2. 基本思想: 初始化:由给定的 n 个权值 $\left\{ \omega_{1},\omega_{2},\cdots ,\omega_{n}\right\}$构造 n