实验七 二叉树的其他典型算法及其应用(1)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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={|1≤i≤m, 1≤j≤n-1}

Col ={|1≤i≤m-1, 1≤j≤n}

基本操作:

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);

}

相关文档
最新文档