数据结构 实验报告
实验三  树的应用
一、实验目的:
1掌握二叉树基本操作
2.掌握构造哈夫曼树及哈夫曼编码的方法
二、实验要求:
1.C完成算法设计和程序设计并上机调试通过。
2.撰写实验报告,提供实验结果和数据。
3.写出算法设计小结和心得。
三、实验内容:
1采用二叉链表存储结构,编写程序实现按层次遍历二叉树。
2.从键盘输入若干字符,统计每个字符出现的频率,将字符出现的频率作为结点的权值,建立哈夫曼树,然后对各个字符进行哈夫曼编码,最后打印输出每个字符及对应的哈夫曼编码。
一个完整的哈夫曼编码/译码系统应具有以下功能:
(1)初始化:从终端读入一段英文字符,统计每个字符出现的频率,建立哈夫曼树;
(2)编码:利用建好的哈夫曼树对各字符进行编码,并输出结果(要求输出哈夫曼树存储结构的初态、终态及字符的哈夫曼编码);
(3)译码:利用已建立的哈夫曼编码对输入的字符序列进行译码,并输出结果;(选做)
(4)解码:利用哈夫曼编码,对任意输入的0、1序列能正确解码,并输出结果。(选做)
四、程序源代码:

(1)#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
typedef char TElemType;
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
/*创建二叉树*/
void create(BiTree *T)
{
char c;
scanf("%c",&c);
if(c!='#')
{
    *T=(BiTree)malloc(sizeof(BiTNode));
    (*T)->data=c;
    create(&((*T)->lchild));
    create(&((*T)->rchild));
}
else *T=NULL;
}
/*按层遍历*/
void Traverse(BiTree T)
{
BiTree Queue[20];             
BiTree p;
int front=0,rear=0;
if(T)
{
    p=T;
    Queue[rear]=p;
    rear=(rear+1)%20;
    while(front!=rear)
    {
      p=Queue[front];
      printf("%c",p->data);
      front=(front+1)%20;
      if(p->lchild)
      {
        Queue[rear]=p->lchild;
        rear=(rear+1)%20;
      }
      if(p->rchild)
      {
        Queue[rear]=p->rchild;
        rear=(rear+1)%20;
      }
    }
}
}
main()
{
BiTree T;
create(&T);
Traverse(T);
getch();
}
(2)#include<stdio.h>
#include<conio.h>
#include<iostream.h>
#include<string.h>
#include<stdlib.h>
#define MAXVALUE 10000
#define MAXLEAF 30
#define MAXNODE MAXLEAF*2-1
#define MAXBIT 50
typedef struct node  /*结点类型定义*/
{二叉树的遍历及应用实验报告
    char letter;
    int weight;
    int parent;
    int lchild;
    int rchild;
}HNodeType;
typedef struct    /*编码类型定义*/
{
    char letter;
    int bit[MAXBIT];
    int start;
}HCodeType;
typedef struct  /*输入符号的类型*/
{
    char s;
    int num;
}lable;
void HuffmanTree(HNodeType HuffNode[],int n,lable a[])
{
    int i,j,m1,m2,x1,x2,temp1;
    char temp2;
    for (i=0;i<2*n-1;i++)      /*结点初始化*/
    {
        HuffNode[i].letter=0;
        HuffNode[i].weight=0;
        HuffNode[i].parent=-1;
        HuffNode[i].lchild=-1;
        HuffNode[i].rchild=-1;
    }
    for (i=0;i<n-1;i++)
        for (j=i+1;j<n-1;j++)
            if (a[j].num>a[i].num)
            {
                temp1=a[i].num;
                a[i].num=a[j].num;
                a[j].num=temp1;
                temp2=a[i].s;
                a[i].s=a[j].s;
                a[j].s=temp2;
            }
    for (i=0;i<n;i++)
    {
        HuffNode[i].weight=a[i].num;
        HuffNode[i].letter=a[i].s;
    }
    for (i=0;i<n-1;i++)        /*构造huffman树*/
    {
        m1=m2=MAXVALUE;
        x1=x2=0;
        for (j=0;j<n+i;j++)
        {
            if (HuffNode[j].parent==-1&&HuffNode[j].weight<m1)
            {
                m2=m1;
                x2=x1;
                m1=HuffNode[j].weight;
                x1=j;
            }
            else if (HuffNode[j].parent==-1&&HuffNode[j].weight<m2)
            {
                m2=HuffNode[j].weight;
                x2=j;
            }
        }
        HuffNode[x1].parent=n+i;
        HuffNode[x2].parent=n+i;
        HuffNode[n+i].weight=HuffNode[x1].weight+HuffNode[x2].weight;
        HuffNode[n+i].lchild=x1;
        HuffNode[n+i].rchild=x2;
    }
}
void HuffmanCode(int n,lable a[])
{
    HNodeType HuffNode[MAXNODE];
    HCodeType HuffCode[MAXLEAF],cd;
    int i,j,c,p;
    HuffmanTree(HuffNode,n,a);
    for (i=0;i<n;i++)    /*按结点位置进行编码*/
    {
        cd.start=n-1;
        c=i;
        p=HuffNode[c].parent;
        while (p!=-1)
        {
            if (HuffNode[p].lchild==c)
                cd.bit[cd.start]=0;
            else cd.bit[cd.start]=1;
            cd.start--;
            c=p;
            p=HuffNode[c].parent;
        }
        for (j=cd.start+1;j<n;j++)    /*储存编码*/
            HuffCode[i].bit[j]=cd.bit[j];
        HuffCode[i].start=cd.start;

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。