实验七 二叉树的其他典型算法及其应用(1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验七二叉树的其他典型算法及其应用
一、实验目的
1、深入了解二叉树递归遍历算法的执行过程,熟练掌握二叉树先序非递归遍历算法、中序非递归算法及其应用。
2、掌握二叉树顺序存储结构、二叉链表结构和静态三叉链表结构的特点与适用范围。
3、掌握哈弗曼树及其应用。
4、掌握树的常用存储结构。
二、实验内容和要求
1、设计并验证如下算法:输入一颗二叉树的广义表形式,建立该二叉树的二叉链表结构,并求其部结点数目。例如,对“12.7.4参考源程序”所示二叉树,按下列形式读入字符:C(E(I,(,J)),f(,G(K,H)))#。
2、哈弗曼编\译码器。要求根据给定的权值,构建哈弗曼树、实现哈弗曼编码和译码。
三、实验过程及结果
(第一题)
一、需求分析
1、构成广义表的合法字符:小写或大写字母、空白字符、圆括弧和逗号,且设广
义表的原子为单个字符。
2、演示程序以用户和计算机的对话方式执行,广义表的建立方式为边输入边建立;
分解操作的进行方式为,每次输入整个一个命令,按回车然后显示每一个操作的结果。
3、程序执行的命令:
1)建立广义表,提示用户输入广义表字符串;
2)多种方式遍历所建立的树,创建完成后每输入一次命令后在计算机终端显示每
一次遍历的结果。
3)求所建树其部结点数;
4)求所建树的高度。
4、输入过程中能自动滤去合法字符以外的其他字符,并能在输入不当时输出相应
的提示信息。
5、测试数据:
1)输入:
输出:
二、概要设计
1、广义表的抽象数据类型定义:
ADT GList{
数据对象:D={ aij|i=1,2,…,m,j=1,2,…,n;
Ai,j∈ElemSet,m和n分别称为矩阵的行数和列数} 数据关系:R={Row,Col}
Row={
Col ={
基本操作:
InitBiTree(&BT)
操作结果:构造空二叉树CreateBiTree(&BT)
操作结果:建立二叉树
PreOrder(BT)
初始条件:二叉树BT已存在
操作结果:先序遍历
InOrder(BT)
初始条件:二叉树BT已存在
操作结果:中序遍历
PostOrder(BT)
初始条件:二叉树BT已存在
操作结果:后序遍历
LevelOrder(BT)
初始条件:二叉树BT已存在
操作结果:按层次遍历
NRPreOrderOrder(BT)
初始条件:二叉树BT已存在
操作结果:先序非递归遍历
NodeNumber(BT)
初始条件:二叉树BT已存在
操作结果:求BT的所有结点数
TreeDepth(BT)
初始条件:二叉树BT已存在
操作结果:求BT的高度
}ADT GList;
⒊本程序模块结构
⑴主函数模块
void main(){
初始化两颗二叉树;
创建二叉树BT,返回根结点BT;
getchar();
while(继续运行){
目录;
Switch(select){
1. PreOrder Traversal;
2. InOrder Traversal;
3. PostOrder Traversal;
4. LevelOrder Traversal;
5.NRPreOrder Traversal;
6.NodeNumber;
7. TreeDepth;
8. Exit;
scanf("%d",&select);
}
}
}
三、详细设计
1、结点、指针类型
⑴二叉链表的存储结构
typedef char TElemType;
typedef struct BiTNode{
TElemType data;
struct BiTNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
2、重要算法的伪码:
CreateBiTree(BiTree **BT){
InitStack(&S);
*BT=NULL;
scanf("%c",&ch);
while(ch!='#'){
switch(ch){
case '(':Push(&S,&p);flag=1;break;
case ',':flag=0;break;
case ')':Pop(&S,&p);break;
default:p=(BiNode *)malloc(sizeof(BiNode));
p->lchild=p->rchild=NULL;
p->data=ch;
if(!(*BT))
*BT=p;
else{
GetTop(S,&e);
if(flag)
e->lchild=p;
else
e->rchild=p;
}break;
}
scanf("%c",&ch);
}
}
TreeDepth(BiTree BT){
if(!BT) return 0;
else return
(max(TreeDepth(BT->lchild),TreeDepth(BT->rchild))+1);
}