树与二叉树实验

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{
int n=0;
if(tree==NULL)
return(0);
if(tree->lTree!=NULL&&tree->rTree!=NULL)
n=1;
return(Twochild(tree->lTree)+Twochild(tree->rTree)+n);
}
实验结果截图:
2、哈夫曼编码
2、哈夫曼编码
【实验目的】
了解赫夫曼树的结构特点及有关概念,掌握赫夫曼树的建立和赫夫曼编码的设计
【问题描述】
使用二叉树进行赫夫曼编码的设计,要求对输入的一串电文字符实现赫夫曼编码,再对赫夫编码生成的代码串进行译码,输出电文字符串
【实验功能】
1、赫夫曼树的建立:从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmtree中;
PreTraverse(&tree);//先序遍历递归
cout<<"先序遍历非递归:";
PreOrderTraverse(&tree);//先序遍历非递归
cout<<endl;
cout<<"中序遍历递归为:";
InTraverse(&tree);//中序遍历递归
cout<<"中序遍历非递归:";
InOrderTraverse(&tree);//中序遍历非递归
}
else
cout<<tree->data<<" ";
}
}
void InOrderTraverse(Tree *tree)//中序遍历非递归
{
Tree *D[80]={NULL};
int top =0;
while ((tree!=NULL)||(top))
{
if (tree!=NULL)
{
top++;









1、以二叉链表方式建立二叉树,并任选一种遍历方式输出结点的值
【实验目的】
(1)了解二叉树的结构特点及有关概念,掌握二叉树建立的基本算法;
(2)了解二叉树遍历的概念,掌握遍历二叉的算法。
【实验内容】
按层次序依次输入元素值,以链表方式建立该二叉树,然后可依据先序、中序、后序中的任一种遍历方法遍历二叉树的方式输出结点的值。
return 0;
if(tree->lTree==NULL&&tree->rTree==NULL)
return 1;
else
{
num1=NodesTree(tree->lTree);
num2=NodesTree(tree->rTree);
return(num1+num2+1);
}
}
int Twochild(Tree*tree)//度为2的
cout<<endl;
cout<<"后序遍历递归为:";
PostTraverse(&tree);//后序遍历递归
cout<<"后序遍历非递归:";
LastOrderTraverse(&tree);//后序遍历非递归
cout<<endl;
cout<<"树的深度为:";
H=DepthTree(&tree);
if (u>v)
return (u+1);
return (v+1);
}
int LeafsTree(Tree *tree)//子叶个数函数
{
int num1,num2;
if(tree==NULL)
return 0;
else if(tree->lTree==NULL&&tree->rTree==NULL)
2、赫夫曼编码的生成:利用以建好的赫夫曼树,对报文文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中;
3、编码文件的译码:利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。










1、以二叉链表方式建立二叉树,并任选一种遍历方式输出结点的值
return 1;
else
{
num1=LeafsTree(tree->lTree);
num2=LeafsTree(tree->rTree);
return(num1+num2);
}
}
int NodesTree(Tree *tree)//结点个数函数
{
int num1,num2;
if(tree==NULL)
cout<<tree->data<<" ";
}
else
cout<<tree->data<<" ";
}
}
void LastOrderTraverse(Tree *tree)//后序遍历非递归
{
Tree *stack[Maxsize]={NULL},*p;
p=tree;
int top=0,tag=1,i=0,k=0;
程序:
#include<iostream.h>
#include<malloc.h>
#define Maxsize 100
typedef struct TREE{
struct TREE *lTree;
struct TREE *rTree;
char data;
}Tree;
void InitTree(Tree*);//初始化树
2哈夫曼编码实验目的了解赫夫曼树的结构特点及有关概念掌握赫夫曼树的建立和赫夫曼编码的设计问题描述使用二叉树进行赫夫曼编码的设计要求对输入的一串电文字符实现赫夫曼编码再对赫夫编码生成的代码串进行译码输出电文字符串实验功能1赫夫曼树的建立
福州大学数计学院
《数据结构》上机实验报告
专业:信息数学
学号
031201206
}
}
}
void PreTraverse(Tree*tree)//先序遍历递归
{
if(tree!=NULL)
{
cout<<tree->data<<" ";
if(tree->lTree!=NULL)
{
PreTraverse(tree->lTree);
PreTraverse(tree->rTree);
}
else if(tree->rTree!=NULL)
姓名
詹小青
班级
02班
实验名称
树与二叉树实验
实验内容
树型结构及其应用







【背景知识】
二叉树的存储、建立、遍历及其应用。
【目的要求】
1.掌握二叉树的存储实现。
2.掌握二叉树的遍历思想。
3.掌握二叉树的常见算法的程序实现。
【实验主要内容】
运用树的结构来实现建树、遍历等算法,并能运用,如哈夫曼问题的设计。
}
else
i=0;
}
}
if(top!=0)
p=stack[top]->rTree;
else
p=NULL;
}
}
}
int DepthTree(Tree *tree) //深度函数
{
int u,v;
if (tree==NULL) return 0;
u=DepthTree(tree->lTree);
v=DepthTree(tree->rTree);
}
void InitTree(Tree *tree)//初始化树
{
tree->lTree=NULL;
tree->rTree=NULL;
tree->data='0';
}
void CreatTree(Tree *tree)//创建树
{
int n=0,m=0,i=0;
if(tree->data=='0')
{
cout<<"请输入该节点的数据:";
cin>>tree->data;
}
cout<<"节点"<<tree->data<<"是否有左子树(0:没有1:有):";
cin>>n;
if(n==1)
{
Tree *lTree=(Tree*)malloc(sizeof(Tree));
tree->lTree=lTree;
cin>>m;
if(m==0);
else if(m==1)
{
Tree *rTree=(Tree*)malloc(sizeof(Tree));
tree->rTree=rTree;
rTree->lTree=NULL;
rTree->rTree=NULL;
rTree->data='0';
CreatTree(tree->rTree);
{
cout<<tree->data<<" ";
top++;
S[top] = tree;
tree = tree->lTree;
}
else
{
tree = S[top];
top--;
tree = tree->rTree;
}
}
}
void InTraverse(Tree *tree)//中序遍历递归
{
if(tree!=NULL)
{
if(tree->lTree!=NULL)
{
PostTraverse(tree->lTree);
PostTraverse(tree->rTree);
cout<<tree->data<<" ";
}
else if(tree->rTree!=NULL)
{
PostTraverse(tree->rTree);
{
if(tree->lTree!=NULL)
{
InTraverse(tree->lTree);
cout<<tree->data<<" ";
InTraverse(tree->rTree);
}
else if(tree->rTree!=NULL)
{
cout<<tree->data<<" ";
InTraverse(tree->rTree);
{
PreTraverse(tree->rTree);
}
else;
}
}
void PreOrderTraverse(Tree *tree)//先序遍历非递归
{
Tree *S[80]={NULL};
int top =0;
while ((tree!=NULL)||(top))
{
if (tree!=NULL)
int NodesTree(Tree *tree);//计算结点个数
int Twochild(Tree*tree);//计算度为二的结点个数
void main()
{
int H,L;
Tree tree;
Tree m;
InitTree(&tree);
CreatTree(&tree);
cout<<"先序遍历递归为:";
void PostTraverse(Tree *tree);//后序遍历递归
void LastOrderTraverse(Tree *tree);//后序遍历非递归
int DepthTree(Tree *tree);//计算树的深度
int LeafsTree(Tree *tree);//计算叶子结点个数
lTree->lTree=NULL;
lTree->rTree=NULL;
lTree->data='0';
CreatTree(tree->lTree);
cout<<"节点"<<tree->data<<"是否有右子树(0:没有1:有):";
cin&ge if(i==1)
{
Tree *rTree=(Tree*)malloc(sizeof(Tree));
tree->rTree=rTree;
rTree->lTree=NULL;
rTree->rTree=NULL;
rTree->data='0';
CreatTree(tree->rTree);
}
}
else if(n==0)
{
cout<<"节点"<<tree->data<<"是否有右子树(0:没有1:有):";
{
while(i)
{
if(stack[top]!=NULL)
{
if(stack[top]->rTree!=NULL)
{
if(stack[top]->rTree->data==stack[top+1]->data)
cout<<stack[top--]->data<<" ";
else
i=0;
}
else
i=0;
while(p!=NULL || top)
{
i=1;
while(p!=NULL)
{
stack[++top]=p;
p=p->lTree;
}
if(top!=0)
p=stack[top]->rTree;
if(p==NULL)
{
cout<<stack[top--]->data<<" ";
if(stack[top]!=NULL)
void CreatTree(Tree*);//创建二叉树
void PreTraverse(Tree*);//先序遍历递归
void PreOrderTraverse(Tree*);//先序遍历非递归
void InTraverse(Tree *tree);//中序遍历递归
void InOrderTraverse(Tree *tree);//中序遍历非递归
相关文档
最新文档