树结构及其应用
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int w;//w表示权值
int i;
char k;//k表示获取的字符
for(i=0;i<n;i++)
{
printf("请输入第%d个字符:",i+1);
scanf("%c",&k);
getchar();
t[i].key=k;
printf("请输入第%d个字符的权值:",i+1);
scanf("%d",&w);
PrintTree(T,layer);
}
赫夫曼编码
问题描述:
设某编码系统共有n个字符,使用频率分别为w1,w2,…,wn,设计一个不等长的编码方案,使得该编码系统的空间效率最好。
基本要求:
I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
{
min2=t[j].weight;
*p2=j;
}
}
void creathfmt(hfmt t)//创建哈夫曼树的函数
{
int i,p1,p2;
inithfmt(t);
inputweight(t);
for(i=n;i<2*n-1;i++)
{
selectmin(t,i-1,&p1,&p2);
t[p1].parent=i;
printf(" ");
printf("%c\n",Boot->data);
PrintTree(Boot->LChild,nLayer+1);
}
void main()
{
BitTree T;
int h;
int layer;
int treeleaf;
layer=0;
printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n");
#include <malloc.h>
#include <conio.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BitNode,*BitTree;
中南大学
数据结构实验报告
题目:树结构及其应用
学生姓名:张雨欣
学号:0902150323
指导老师:余腊生
学院:信息科学与工程学院
专业班级:计科工试1501班
完成时间:2016年12月27日
指导老师评定:签名:
需求分析
二叉树的建立与遍历
问题描述:
建立一棵二叉树,并对其进行遍历(先序,中序和后序),打印输出遍历结果
printf("**********************哈夫曼编数结构:*****************************\n");
printf("\t\t权重\t父母\t左孩子\t右孩子\t字符\t");
for(i=0;i<2*n-1;i++)
{
printf("\n");
printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild,t[i].key);
测试数据:
由读者依据软件工程的测试技术自己确定,注意测试边界数据。
实现提示:
利用赫夫曼编码树求得最佳的编码方案
(1)文件CodeFile的基类可以设为字节型
(2)用户界面可以设计为菜单形式,除显示上述功能符号外,还应显示Q,表示退出,请用户键入一个选择功能符,此功能执行完毕后再显示此菜单,直至某次用户选择了E为止
(*bt)->data=ch;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->RChild));
}
}
void Visit(char ch)//访问根节点
{
printf("%c ",ch);
}
void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{
if (root!=NULL)
{
Visit(root ->data); /*访问根结点*/
PreOrder(root ->LChild); /*先序遍历左子树*/
PreOrder(root ->RChild); /*先序遍历右子树*/
}
}
void InOrder(BitTree root)
/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
t[p2].parent=i;
t[i].lchild=p1;
t[i].rchild=p2;
t[i].weight=t[p1].weight+t[p2].weight;
}
}
void printhfmt(hfmt t)//打印哈夫曼树
{
int i;
printf("----------------------------------------------Biblioteka Baidu-------------------\n");
E:编码(Encoding)。利用以建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件To Be Tran中的正文进行编码,然后将结果存入文件CodeFile中。
D:译码(Decoding)。利用已建好的哈夫曼树将文件Code File中的代码进行译码,结果存入文件Text File中。
for(i=0;i<n;i++)
{
j=0;
printf("\n");
printf("\t\t%c\t",t[i].key,t[i].weight);
hfmtpath(t,i,j);
}
printf("\n------------------------------------------------------------------\n");
基本要求:
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序,中序和后序),将遍历结果打印输出。
测试数据:
AB.CE..G.D.F.H..则输出结果为:先序为ABCEGDFH,中序为BECGADFH,后序为EGCBHFDA
源程序
#include<stdio.h>
{
if (root!=NULL)
{
InOrder(root ->LChild); /*中序遍历左子树*/
Visit(root ->data); /*访问根结点*/
InOrder(root ->RChild); /*中序遍历右子树*/
}
}
void PostOrder(BitTree root)
/*后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!=NULL)
{
PostOrder(root ->LChild); /*后序遍历左子树*/
PostOrder(root ->RChild); /*后序遍历右子树*/
Visit(root ->data); /*访问根结点*/
}
}
int PostTreeDepth(BitTree bt) //后序遍历求二叉树的高度递归算法//
printf("------------------------------------------------------------------\n");
printf("******************************输入区******************************\n");
{
int hl,hr,max;
if(bt!=NULL)
{
hl=PostTreeDepth(bt->LChild); //求左子树的深度
hr=PostTreeDepth(bt->RChild); //求右子树的深度
max=hl>hr?hl:hr; //得到左、右子树深度较大者
return(max+1); //返回树的深度
P:印代码文件(Print)。将文件Code File以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件Code Print中。
T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件Tree Print中。
CreatBiTree(&T);
printf("先序遍历序列为:");
PreOrder(T);
printf("\n中序遍历序列为:");
InOrder(T);
printf("\n后序遍历序列为:");
PostOrder(T);
h=PostTreeDepth(T);
printf("\nThe depth of this tree is:%d\n",h);
printf("\n------------------------------------------------------------------\n");
printf("**************************哈夫曼编码******************************");
a=i;
b=j=t[i].parent;
if(t[j].parent!=-1)
{
i=j;
hfmtpath(t,i,j);
}
if(t[b].lchild==a)
printf("0");
else
printf("1");
}
void phfmnode(hfmt t)//对字符进行初始编码
{
int i,j,a;
if(t[j].parent==-1)
if(min1>t[j].weight)
{
min1=t[j].weight;
*p1=j;
}
for(j=0;j<=i;j++)//选择次小权值字符的下标还回
if(t[j].parent==-1)
if(min2>t[j].weight && j!=(*p1))//注意j!=(*p1))
}
else return(0); //如果是空树,则返回0
}
void PrintTree(BitTree Boot,int nLayer) //按竖向树状打印的二叉树//
{
int i;
if(Boot==NULL) return;
PrintTree(Boot->RChild,nLayer+1);
for(i=0;i<nLayer;i++)
printf("\n请输入n=");
scanf("%d",&n);
getchar();
for(i=0;i<2*n-1;i++)//对结构体进行初始化
{
t[i].weight=0;
t[i].lchild=-1;
t[i].rchild=-1;
t[i].parent=-1;
}
printf("\n");
}
void inputweight(hfmt t)//输入函数
}
printf("\n------------------------------------------------------------------\n");
printf("\n\n");
}
void hfmtpath(hfmt t,int i,int j)//编码的重要哈夫曼树路径递归算法
{
int a,b;
void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点//
{
char ch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BitTree)malloc(sizeof(BitNode));
(3)在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入,每次执行时不一定执行I命令,因为hrmTree可能早以建好。
源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
getchar();
t[i].weight=w;
printf("\n");
}
}
void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数
{
long min1=999999;
long min2=999999;
int j;
for(j=0;j<=i;j++)//选择最小权值字符的下标返回
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
int n;
void inithfmt(hfmt t)//对结构体进行初始化
{
int i;
printf("\n");
int w;//w表示权值
int i;
char k;//k表示获取的字符
for(i=0;i<n;i++)
{
printf("请输入第%d个字符:",i+1);
scanf("%c",&k);
getchar();
t[i].key=k;
printf("请输入第%d个字符的权值:",i+1);
scanf("%d",&w);
PrintTree(T,layer);
}
赫夫曼编码
问题描述:
设某编码系统共有n个字符,使用频率分别为w1,w2,…,wn,设计一个不等长的编码方案,使得该编码系统的空间效率最好。
基本要求:
I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。
{
min2=t[j].weight;
*p2=j;
}
}
void creathfmt(hfmt t)//创建哈夫曼树的函数
{
int i,p1,p2;
inithfmt(t);
inputweight(t);
for(i=n;i<2*n-1;i++)
{
selectmin(t,i-1,&p1,&p2);
t[p1].parent=i;
printf(" ");
printf("%c\n",Boot->data);
PrintTree(Boot->LChild,nLayer+1);
}
void main()
{
BitTree T;
int h;
int layer;
int treeleaf;
layer=0;
printf("请输入二叉树中的元素(以扩展先序遍历序列输入,其中.代表空子树):\n");
#include <malloc.h>
#include <conio.h>
typedef int DataType;
typedef struct Node
{
DataType data;
struct Node *LChild;
struct Node *RChild;
}BitNode,*BitTree;
中南大学
数据结构实验报告
题目:树结构及其应用
学生姓名:张雨欣
学号:0902150323
指导老师:余腊生
学院:信息科学与工程学院
专业班级:计科工试1501班
完成时间:2016年12月27日
指导老师评定:签名:
需求分析
二叉树的建立与遍历
问题描述:
建立一棵二叉树,并对其进行遍历(先序,中序和后序),打印输出遍历结果
printf("**********************哈夫曼编数结构:*****************************\n");
printf("\t\t权重\t父母\t左孩子\t右孩子\t字符\t");
for(i=0;i<2*n-1;i++)
{
printf("\n");
printf("\t\t%d\t%d\t%d\t%d\t%c",t[i].weight,t[i].parent,t[i].lchild,t[i].rchild,t[i].key);
测试数据:
由读者依据软件工程的测试技术自己确定,注意测试边界数据。
实现提示:
利用赫夫曼编码树求得最佳的编码方案
(1)文件CodeFile的基类可以设为字节型
(2)用户界面可以设计为菜单形式,除显示上述功能符号外,还应显示Q,表示退出,请用户键入一个选择功能符,此功能执行完毕后再显示此菜单,直至某次用户选择了E为止
(*bt)->data=ch;
CreatBiTree(&((*bt)->LChild));
CreatBiTree(&((*bt)->RChild));
}
}
void Visit(char ch)//访问根节点
{
printf("%c ",ch);
}
void PreOrder(BitTree root) /*先序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
{
if (root!=NULL)
{
Visit(root ->data); /*访问根结点*/
PreOrder(root ->LChild); /*先序遍历左子树*/
PreOrder(root ->RChild); /*先序遍历右子树*/
}
}
void InOrder(BitTree root)
/*中序遍历二叉树, root为指向二叉树(或某一子树)根结点的指针*/
t[p2].parent=i;
t[i].lchild=p1;
t[i].rchild=p2;
t[i].weight=t[p1].weight+t[p2].weight;
}
}
void printhfmt(hfmt t)//打印哈夫曼树
{
int i;
printf("----------------------------------------------Biblioteka Baidu-------------------\n");
E:编码(Encoding)。利用以建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件To Be Tran中的正文进行编码,然后将结果存入文件CodeFile中。
D:译码(Decoding)。利用已建好的哈夫曼树将文件Code File中的代码进行译码,结果存入文件Text File中。
for(i=0;i<n;i++)
{
j=0;
printf("\n");
printf("\t\t%c\t",t[i].key,t[i].weight);
hfmtpath(t,i,j);
}
printf("\n------------------------------------------------------------------\n");
基本要求:
从键盘接受输入(先序),以二叉链表作为存储结构,建立二叉树(以先序来建立),并采用递归算法对其进行遍历(先序,中序和后序),将遍历结果打印输出。
测试数据:
AB.CE..G.D.F.H..则输出结果为:先序为ABCEGDFH,中序为BECGADFH,后序为EGCBHFDA
源程序
#include<stdio.h>
{
if (root!=NULL)
{
InOrder(root ->LChild); /*中序遍历左子树*/
Visit(root ->data); /*访问根结点*/
InOrder(root ->RChild); /*中序遍历右子树*/
}
}
void PostOrder(BitTree root)
/*后序遍历二叉树,root为指向二叉树(或某一子树)根结点的指针*/
{
if(root!=NULL)
{
PostOrder(root ->LChild); /*后序遍历左子树*/
PostOrder(root ->RChild); /*后序遍历右子树*/
Visit(root ->data); /*访问根结点*/
}
}
int PostTreeDepth(BitTree bt) //后序遍历求二叉树的高度递归算法//
printf("------------------------------------------------------------------\n");
printf("******************************输入区******************************\n");
{
int hl,hr,max;
if(bt!=NULL)
{
hl=PostTreeDepth(bt->LChild); //求左子树的深度
hr=PostTreeDepth(bt->RChild); //求右子树的深度
max=hl>hr?hl:hr; //得到左、右子树深度较大者
return(max+1); //返回树的深度
P:印代码文件(Print)。将文件Code File以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件Code Print中。
T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件Tree Print中。
CreatBiTree(&T);
printf("先序遍历序列为:");
PreOrder(T);
printf("\n中序遍历序列为:");
InOrder(T);
printf("\n后序遍历序列为:");
PostOrder(T);
h=PostTreeDepth(T);
printf("\nThe depth of this tree is:%d\n",h);
printf("\n------------------------------------------------------------------\n");
printf("**************************哈夫曼编码******************************");
a=i;
b=j=t[i].parent;
if(t[j].parent!=-1)
{
i=j;
hfmtpath(t,i,j);
}
if(t[b].lchild==a)
printf("0");
else
printf("1");
}
void phfmnode(hfmt t)//对字符进行初始编码
{
int i,j,a;
if(t[j].parent==-1)
if(min1>t[j].weight)
{
min1=t[j].weight;
*p1=j;
}
for(j=0;j<=i;j++)//选择次小权值字符的下标还回
if(t[j].parent==-1)
if(min2>t[j].weight && j!=(*p1))//注意j!=(*p1))
}
else return(0); //如果是空树,则返回0
}
void PrintTree(BitTree Boot,int nLayer) //按竖向树状打印的二叉树//
{
int i;
if(Boot==NULL) return;
PrintTree(Boot->RChild,nLayer+1);
for(i=0;i<nLayer;i++)
printf("\n请输入n=");
scanf("%d",&n);
getchar();
for(i=0;i<2*n-1;i++)//对结构体进行初始化
{
t[i].weight=0;
t[i].lchild=-1;
t[i].rchild=-1;
t[i].parent=-1;
}
printf("\n");
}
void inputweight(hfmt t)//输入函数
}
printf("\n------------------------------------------------------------------\n");
printf("\n\n");
}
void hfmtpath(hfmt t,int i,int j)//编码的重要哈夫曼树路径递归算法
{
int a,b;
void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是#当前树根置为空,否则申请一个新节点//
{
char ch;
ch=getchar();
if(ch=='.')*bt=NULL;
else
{
*bt=(BitTree)malloc(sizeof(BitNode));
(3)在程序的一次执行过程中,第一次执行I,D或C命令之后,赫夫曼树已经在内存了,不必再读入,每次执行时不一定执行I命令,因为hrmTree可能早以建好。
源代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXLEN 100
getchar();
t[i].weight=w;
printf("\n");
}
}
void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数
{
long min1=999999;
long min2=999999;
int j;
for(j=0;j<=i;j++)//选择最小权值字符的下标返回
typedef struct
{
int weight;
int lchild;
int rchild;
int parent;
char key;
}htnode;
typedef htnode hfmt[MAXLEN];
int n;
void inithfmt(hfmt t)//对结构体进行初始化
{
int i;
printf("\n");