当前位置:首页经验技巧Word经验word文档

如何利用word画哈夫曼树,利用

2026-01-31 09:48:42

1.数据结构中哈夫曼树的应用(C语言)

#include #include typedef int DataType; #define MaxValue 10000 #define MaxBit 10 #define MaxN 100 #define N 100; int n1=0; char c[100]; typedef struct Node { DataType data; struct Node *leftChild; struct Node *rightChild; }BiTreeNode; typedef struct { int weight; int flag; int parent; int leftChild; int rightChild; }HaffNode; typedef struct { int bit[MaxN]; int start; int weight; }Code; struct worder { char words; /*字符*/ }word[100]; struct weighted { int weighter; /*转换权值有利于文件的存储*/ }weight[100] ; void Initiate(BiTreeNode **root) /*初始化二叉树*/ { *root=(BiTreeNode * )malloc(sizeof(BiTreeNode)); (*root)->leftChild=NULL; (*root)->rightChild=NULL; } BiTreeNode *InsertLeftNode(BiTreeNode *curr,DataType x) /*插入左子树*/ { BiTreeNode *s,*t; if(curr==NULL) return NULL; t=curr->leftChild; s=(BiTreeNode *)malloc(sizeof(BiTreeNode)); s->data=x; s->leftChild=t; s->rightChild=NULL; curr->leftChild=s; return curr->leftChild; } BiTreeNode *InsertRightNode(BiTreeNode *curr ,DataType x) /*插入右子树*/ { BiTreeNode *s,*t; if(curr==NULL) return NULL; t=curr->rightChild; s=(BiTreeNode *)malloc(sizeof(BiTreeNode)); s->data=x; s->rightChild=t; s->leftChild=NULL; curr->rightChild=s; return curr->rightChild; } void Haffman(int weigh[],int n,HaffNode haffTree[],int a[][3]) /*建立哈夫曼树*/ { int i,j,m1,m2,x1,x2; for(i=0;i<2*n-1;i++) { if(istart=n-1; cd->weight=haffTree[i].weight; child=i; parent=haffTree[child].parent; while(parent!=-1) { if(haffTree[parent].leftChild==child) cd->bit[cd->start]=0; else cd->bit[cd->start]=1; cd->start--; child=parent; parent=haffTree[child].parent; } for(j=cd->start+1;jbit[j]; haffCode[i].start=cd->start+1; haffCode[i].weight=cd->weight; } } void PrintBiTree(BiTreeNode *bt ,int n) /*将哈夫曼树转换成的二叉树进行打印*/ { int i; if(bt==NULL) return; PrintBiTree(bt->rightChild,n+1); for(i=0;idata!=0&&bt->data<100) { if(n>0) { printf("---"); printf("%d\n\n",bt->data); } } PrintBiTree(bt->leftChild,n+1); } int search(int a[][3],int m) /*查找和a[][2]相等的权值*/ { int i=1; if(m==1) return 0; while(a[i][2]!=a[m][0]&&i

2.如何用WORD画大树图

其实,word最不擅长的就是画图,画一个东西很费事的。

不如你就查找一下现成的剪贴画,或者去网上搜索合适的图片插入进来。既好看又简单。

对补充的补充: 好大的火气!我还是指导一下你: 1. 自选图形——线条——曲线,勾出树干形状。注意:要横着画,以便填充。

2. 右键点击图形,编辑顶点,调整形状。 3. 右键点击图形——设置自选图形格式——填充——颜色,点开颜色下拉框,填充效果,选择木纹一类的图案,确定。

然后再把线条设置为无。树干就做成了。

4. 写字问题:拉个文本框,输入字后右键点击,把填充和线条都设为“无”,叠放次序为“置为顶层”。 以后的树叶也如此办理,实在不懂的就hi我,我不会朝你冒火的。

3.哈夫曼树的建立

作业吧,运行可用,自己再试试。

//huffman_h.h 哈夫曼树的头文件#include"iostream.h"#include "stdio.h"#include "stdlib.h"#include "string.h" typedef char ElemType; typedef struct{ ElemType elem; unsigned int weight; unsigned int parent,lchild,rchild,tag; }HTNode,*HuffmanTree; typedef char** HuffmanCode; typedef int Status; typedef struct weight { char elem; unsigned int m_weight; }Weight; // 保存符号信息; void Select(HuffmanTree HT,int n,int &s1,int &s2) { int i; s1=s2=0; for(i=1;i<=n;i++){ if(HT[i].weights2) {i=s1; s1=s2; s2=i;} // end of if // end of for } void HuffmanCoding(HuffmanTree &HT, HuffmanCode &HC, Weight* &w, int n) { // w存放n个字符的权值(均>0),构造哈夫曼树HT, // 并求出n个字符的哈夫曼编码HC //本函数实现选择方式:从左往右选择两个小权值结点,结点信息在前面的为左子树,其后为右子树//修改选择方式:依序选择两个小权值结点,权值小的为左子树。!! int i, j, m, s1,s2; char *cd; int p; int cdlen; if (n<=1) return; m = 2 * n - 1; HT = (HuffmanTree)malloc((m+1) * sizeof(HTNode)); // 0号单元未用 for (i=1; i<=n; i++) { //初始化 HT[i].elem=w[i-1].elem; HT[i].weight=w[i-1].m_weight; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } for (i=n+1; i<=m; i++) { //初始化 HT[i].weight=0; HT[i].parent=0; HT[i].lchild=0; HT[i].rchild=0; } printf("\n哈夫曼树的构造过程如下所示:\n"); printf("HT初态:\n 结点 weight parent lchild rchild"); for (i=1; i<=m; i++) printf("\n%4d%8d%8d%8d%8d",i,HT[i].weight, HT[i].parent,HT[i].lchild, HT[i].rchild); printf(" 按任意键,继续 。

"); getchar(); for (i=n+1; i<=m; i++) { // 建哈夫曼树 // 在HT[1..i-1]中选择parent为0且weight最小的两个结点, // 其序号分别为s1和s2。 Select(HT, i-1, s1, s2); HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; printf("\nselect: s1=%d s2=%d\n", s1, s2); printf(" 结点 weight parent lchild rchild"); for (j=1; j<=i; j++) printf("\n%4d%8d%8d%8d%8d",j,HT[j].weight, HT[j].parent,HT[j].lchild, HT[j].rchild); printf(" 按任意键,继续 。

"); getchar(); }//for //------无栈非递归遍历哈夫曼树,求哈夫曼编码 HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd = (char *)malloc((n+1)*sizeof(char)); // 分配求编码的工作空间 p = m; cdlen = 0; for (i=1; i<=m; ++i) // 遍历哈夫曼树时用作结点状态标志 HT[i].tag = 0; while (p) { if (HT[p].tag==0) { // 向左 HT[p].tag = 1; if (HT[p].lchild != 0) { p = HT[p].lchild; cd[cdlen++] ='0'; } else if (HT[p].rchild == 0) { // 登记叶子结点的字符的编码 HC[p] = (char *)malloc((cdlen+1) * sizeof(char)); cd[cdlen] ='\0'; strcpy(HC[p], cd); // 复制编码(串) } } else if (HT[p].tag==1) { // 向右 HT[p].tag = 2; if (HT[p].rchild != 0) { p = HT[p].rchild; cd[cdlen++] ='1'; } } else { // HT[p].weight==2,退回退到父结点,编码长度减1 HT[p].tag = 0; p = HT[p].parent; --cdlen; }//else }//while } // HuffmanCoding/* //--- 从叶子到根逆向求每个字符的哈夫曼编码 --- cd = (char *)malloc(n*sizeof(char)); // 分配求编码的工作空间 cd[n-1] = '\0'; // 编码结束符。 for (i=1; i<=n; ++i) { // 逐个字符求哈夫曼编码 start = n-1; // 编码结束符位置 for (c=i, f=HT[i].parent; f!=0; c=f, f=HT[f].parent) // 从叶子到根逆向求编码 if (HT[f].lchild==c) cd[--start] = '0'; else cd[--start] = '1'; HC[i] = (char *)malloc((n-start)*sizeof(char)); // 为第i个字符编码分配空间 strcpy(HC[i], &cd[start]); // 从cd复制编码(串)到HC } free(cd); // 释放工作空间*/ void OutputHuffmanCode(HuffmanTree HT,HuffmanCode HC,int n) { int i; printf("\nnumber---element---weight---huffman code\n"); for(i=1;i<=n;i++) printf(" %d %c %d %s\n",i,HT[i].elem,HT[i].weight,HC[i]); } //主函数//huffman.cpp#include"huffman_h.h" void main() { HuffmanTree HT; HuffmanCode HC; Weight *w; char c; // the symbolizes; int i,n; // the number of elements; int wei; // the weight of a element; printf("请输入构建哈夫曼树的结点数:" ); cin>>n; //cout<


免责声明:本站信息来自网络收集及网友投稿,仅供参考,如果有错误请反馈给我们更正,对文中内容的真实性和完整性本站不提供任何保证,不承但任何责任,谢谢您的合作。
版权所有:五学知识网 Copyright © 2015-2026 www.z8000w.com. All Rights Reserved .