实验三二叉树Word文档格式.docx
- 文档编号:19679066
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:8
- 大小:18.82KB
实验三二叉树Word文档格式.docx
《实验三二叉树Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验三二叉树Word文档格式.docx(8页珍藏版)》请在冰豆网上搜索。
1.按先序次序输入二叉树中结点的值,建立一棵以二叉链表作存储结构的二叉树
2.按先序、中序、后序顺序分别遍历这棵二叉树。
注意,用递归的方法实现先序遍历,用非递归的方法实现中序和后序遍历
3.编写一个求二叉树叶子结点数和二叉树的深度的算法。
4.实现二叉树的线索化
5.构建赫夫曼树,实现赫夫曼编码
三、实验要求
实现二叉树的初始化,并设计出基本操作的算法
四、实验环境
PC微机
Windows
操作系统
VisualC++6.0程序集成环境
五、程序代码
1.二叉树的存储结构及遍历二叉树
//-------函数结果状态代码----------
//common.h
#defineTRUE
1
#defineFALSE
0
#defineOK
#defineERROR
#defineINFEASIBLE
-1
#defineOVERFLOW
-2
typedefintStatus;
//-------二叉树的二叉链表存储结构---------
//BiTree.h
typedefstructBiTNode{
TElemTypedata;
structBiTNode*lchild;
//左孩子指针
structBiTNode*rchild;
//右孩子指针
}BiTNode,*BiTree;
//-------栈的链式存储结构---------
//LinkStack.h
#defineSTACK_INIT_SIZE20
//存储空间初始分配量
#defineSTACKINCREMENT2
//存储空间分配增量
typedefstructnode{
SElemTypedata;
structnode*next;
}LinkStack;
//链式栈的结构体定义
//-------基本操作的函数原型说明--------
//关于树的
intPreCreateBiTree(BiTree&
T);
StatusVISIT(TElemTypee);
StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
voidMidVisit(BiTree&
voidPostOrderTraverse(BiTreeT,Status(*visit)(TElemTypee));
voidPostOrder(BiTNode*T,Status(*visit)(TElemTypee));
StatusCountLeaf(BiTreeT);
intdeep(BiTreeT);
//关于栈的
StatusInitStack(LinkStack**S);
StatusPush(LinkStack*S,SElemTypex);
StatusPop(LinkStack*S,SElemType&
e);
StatusStackEmpty(LinkStack*S);
StatusGetTop(LinkStack*S,SElemType&
//--------基本操作的实现-----------
//bitree.cpp
#include<
stdio.h>
malloc.h>
stdlib.h>
#include"
common.h"
typedefcharTElemType;
BiTree.h"
typedefBiTreeSElemType;
LinkStack.h"
intn=0;
//构造而二叉链表表示的二叉树
//插入元素,按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树
T)//递归先序建立{
chare;
scanf("
%c"
&
if(e=='
'
){
T=NULL;
return1;
}
T=(BiTree)malloc(sizeof(BiTNode));
if(!
T)
exit(OVERFLOW);
T->
data=e;
//生成根结点
PreCreateBiTree(T->
lchild);
//构造左子树
rchild);
//构造右子树
returnOK;
//访问树中元素
StatusVISIT(TElemTypee){
printf("
%c"
e);
//采用递归先序遍历二叉树
StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
if(T)
{
if((*visit)(T->
data))
if(PreOrderTraverse(T->
lchild,VISIT))
rchild,VISIT))
returnOK;
returnERROR;
else
//采用中序非递归遍历二叉树
StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
LinkStack*S;
BiTreep;
InitStack(&
S);
Push(S,T);
//根指针进栈
while(!
StackEmpty(S)){
while(GetTop(S,p)&
&
p)
Push(S,p->
//向左走到尽头
Pop(S,p);
StackEmpty(S))
{//访问节点,向右一步
VISIT(p->
//网上查的
T)
//递归中序遍历{
T)
return;
MidVisit(T->
T->
data);
//采用递归后序遍历二叉树(网上查的)
voidPostOrderTraverse(BiTreeT,Status(*visit)(TElemTypee)){
PostOrderTraverse(T->
lchild,VISIT);
rchild,VISIT);
VISIT(T->
//采用非递归后序遍历二叉树(网上查的)
voidPostOrder(BiTNode*T,Status(*visit)(TElemTypee)){
BiTNode*p=T;
BiTNode*stack[30];
intnum=0;
BiTNode*have_visited=NULL;
while(NULL!
=p||num>
0){
=p){
stack[num++]=p;
p=p->
lchild;
p=stack[num-1];
if(NULL==p->
rchild||have_visited==p->
rchild){
num--;
have_visited=p;
p=NULL;
else{
rchild;
//统计二叉树的叶子数
StatusCountLeaf(BiTreeT){
(T->
lchild)&
!
rchild))
n++;
CountLeaf(T->
returnn;
//统计二叉树的深度
intdeep(BiTreeT){
intld,rd;
ld=deep(T->
rd=deep(T->
return(ld+1)>
(rd+1)?
(ld+1):
(rd+1);
//linkstack.cpp
//初始化一个带头结点的空栈
StatusInitStack(LinkStack**S){
*S=(LinkStack*)malloc(sizeof(LinkStack));
if(*S==NULL)
(*S)->
next=NULL;
//入栈操作,将x的数据元素插入栈s中,使x成为新的栈顶元素
StatusPush(LinkStack*S,SElemTypex){
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 二叉