实验五二叉树的构造遍历及应用程序.docx
- 文档编号:4273458
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:29
- 大小:143.73KB
实验五二叉树的构造遍历及应用程序.docx
《实验五二叉树的构造遍历及应用程序.docx》由会员分享,可在线阅读,更多相关《实验五二叉树的构造遍历及应用程序.docx(29页珍藏版)》请在冰豆网上搜索。
实验五二叉树的构造遍历及应用程序
深圳大学实验报告
课程名称:
数据结构
实验项目名称:
实验五:
二叉树的构造、遍历及应用程序
学院:
数学与计算科学学院
专业:
信息与计算科学专业
指导教师:
王保华
报告人:
蔡志刚学号:
2009190118班级:
C班
实验时间:
2010/11/26
实验报告提交时间:
2010/12/12
教务处制
实验目的与要求:
(1)掌握二叉树的存储实现。
(2)掌握二叉树的遍历思想。
(3)掌握二叉树的常见算法的程序实现。
方法、步骤:
(1)输入字符序列,先序建立二叉链表。
(2)实现先序遍历,中序遍历二叉树的递归算法。
(3)用回溯法求解简化的背包问题,输出问题的全部解。
(4)在主函数中设计一个简单的菜单,分别调试上述算法。
实验过程及内容:
//preConst.h
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefcharTElemType;
typedefintSElemType;
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
structLinkStack
{
structyuansu*top;
structyuansu*base;
intstacksize;
};
structyuansu
{
structBiTNode*data;
structyuansu*next;
};
typedefstructBiTNode
{
TElemTypedata;
structBiTNode*lchild,*rchild;//左右孩子指针
}BiTNode,*BiTree;
StatusInitStack(LinkStack&S);
//构建一个空栈
StatusPush(LinkStack&S,BiTreee);
//插入元素e
StatusPop(LinkStack&S,BiTree&e);
//若栈不为空,输出并删除栈顶元素
StackEmpey(LinkStackS);
//若栈S为空栈,则返回TRUE,否则返回FALSE
StatusCreateBiTree(BiTree&T);
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
//构建二叉链表表示的二叉树T。
StatusPrintElement(TElemTypee);
//最简单的Visit函数
StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));
//先序遍历二叉树
StatusInOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee));
//中序遍历二叉树
StatusPreOrderTraversetwo(BiTreeT,Status(*Visit)(TElemTypee));
//非递归算法先序遍历二叉树
//--------------------------------------------------------------
/*
自己的非递归算法
StatusCreateBiTree(BiTree&T);
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
//构建二叉链表表示的二叉树T。
StatusPreOrderTraverse(BiTreeT);
//先序遍历二叉树
*/
/*erchalianbiao.cpp
顺序表函数的实现文件
主要功能:
......
*/
#include"preConst.h"
#include"erchashu.h"
#include
#include
#include
//-----------------------------------------------
//构建一个空栈
StatusInitStack(LinkStack&S)
{
S.base=(yuansu*)malloc(sizeof(yuansu));
if(!
S.base)
exit(OVERFLOW);
S.top=S.base;
S.base->next=NULL;
S.base->data=NULL;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
//-----------------------------------------------
//-----------------------------------------------
//插入元素e
StatusPush(LinkStack&S,BiTreee)
{
yuansu*p;
S.top->data=e;
p=(yuansu*)malloc(STACK_INIT_SIZE*sizeof(yuansu));
p->next=S.top;
S.top=p;
S.top->data=NULL;
S.stacksize=S.stacksize+STACKINCREMENT;
returnOK;
}//push
//-----------------------------------------------
//-----------------------------------------------
//若栈不为空,输出并删除栈顶元素
StatusPop(LinkStack&S,BiTree&e)
{
yuansu*p;
if(S.top==S.base)
returnERROR;
e=S.top->next->data;
p=S.top;
S.top=S.top->next;
free(p);
returnOK;
}//Pop
//-----------------------------------------------
//-----------------------------------------------
//若栈S为空栈,则返回TRUE,否则返回FALSE
StackEmpey(LinkStackS)
{
if(S.top==S.base)
returnTRUE;
else
returnFALSE;
}
//-----------------------------------------------
//--------------------------------------------------------------
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
//构建二叉链表表示的二叉树T。
StatusCreateBiTree(BiTree&T)
{
charch;
scanf("%c",&ch);
fflush(stdin);
if(ch=='#')
T=NULL;
else
{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))
exit(OVERFLOW);
T->data=ch;
CreateBiTree(T->lchild);
CreateBiTree(T->rchild);
}
returnOK;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//最简单的Visit函数
StatusPrintElement(TElemTypee)
{
if(e)
{
printf("%c",e);
}
returnOK;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//先序遍历二叉树
StatusPreOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee))
{
if(T)
{
if(Visit(T->data))
{
if(PreOrderTraverse(T->lchild,Visit))
if(PreOrderTraverse(T->rchild,Visit))
returnOK;
}
returnERROR;
}
else
{
printf("#");
returnOK;
}
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//中序遍历二叉树
StatusInOrderTraverse(BiTreeT,Status(*Visit)(TElemTypee))
{
if(T)
{
if(InOrderTraverse(T->lchild,Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild,Visit))
returnOK;
returnERROR;
}
else
{
printf("#");
returnOK;
}
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//非递归算法先序遍历二叉树
StatusPreOrderTraversetwo(BiTreeT,Status(*Visit)(TElemTypee))
{
structLinkStackS;
InitStack(S);
BiTNode*p;
p=T;
if(!
p)
printf("#");
while(p||!
StackEmpey(S))
{
if(p)
{
Push(S,p);
if(!
Visit(p->data))
returnERROR;
p=p->lchild;
}
else
{
printf("#");
Pop(S,p);
p=p->rchild;
}
}
printf("#");
returnOK;
}
//--------------------------------------------------------------
/*
自己的非递归算法
//--------------------------------------------------------------
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,
//构建二叉链表表示的二叉树T。
StatusCreateBiTree(BiTree&T)
{
structLinkStackS;
InitStack(S);
charc;
inti=1;
BiTNode*p,*t;
p=t=T=(BiTNode*)malloc(sizeof(BiTNode));
printf("请输入元素\n");
c=getchar();
if(c=='#')
{
T->data=NULL;
T->lchild=T->rchild=NULL;
}
else
{
T->data=c;
Push(S,p);
do
{
if(i==1)
{
c=getchar();
if(c=='#')
{
p->lchild=NULL;
i=2;
}
else
{
t=(BiTNode*)malloc(sizeof(BiTNode));
t->data=c;
p->lchild=t;
p=t;
Push(S,p);
}
}
elseif(i==2)
{
if(!
StackEmpey(S))
{
Pop(S,p);
}
c=getchar();
if(c=='#')
{
p->rchild=NULL;
}
else
{
t=(BiTNode*)malloc(sizeof(BiTNode));
t->data=c;
p->rchild=t;
p=t;
Push(S,p);
i=1;
}
}
}while(!
StackEmpey(S));
}
returnOK;
}
//--------------------------------------------------------------
//--------------------------------------------------------------
//先序遍历二叉树
StatusPreOrderTraverse(BiTreeT)
{
structLinkStackS;
InitStack(S);
BiTNode*p,*t;
inti=1;
p=t=T;
if(!
T->data)
printf("#");
else
{
printf("%c",T->data);
Push(S,p);
do
{
if(i==1)
{
if(!
p->lchild)
{
printf("#");
i=2;
}
else
{
p=p->lchild;
Push(S,p);
printf("%c",p->data);
Pop(S,p);
}
}
if(i==2)
{
Pop(S,p);
if(!
p->rchild)
{
printf("#");
}
else
{
p=p->rchild;
Push(S,p);
printf("%c",p->data);
i=1;
}
}
}while(!
StackEmpey(S));
printf("\n");
}
returnOK;
}
//--------------------------------------------------------------
*/
#include"preConst.h"
#include"erchashu.h"
#include
#include
#include
voidmain()
{
inta=1;
while(a)
{
printf("\n\n\n");
printf("菜单.....................................\n");
printf("创建二叉树链表..........................1\n");
printf("先序遍历二叉树链表......................2\n");
printf("中序遍历二叉树链表......................3\n");
printf("先序遍历二叉树链表(非递归算法)..........4\n");
printf("结束程序................................0\n");
printf(".........................................\n");
printf("输入选项:
");
scanf("%d",&a);
fflush(stdin);
switch(a)
{
case1:
BiTNode*T;
CreateBiTree(T);
printf("完成创建\n");
break;
case2:
PreOrderTraverse(T,PrintElement);
printf("\n");
break;
case3:
InOrderTraverse(T,PrintElement);
printf("\n");
break;
case4:
PreOrderTraversetwo(T,PrintElement);
printf("\n");
break;
case0:
a=0;
break;
}
}
}
//preConst.h
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefcharTElemType;
typedefintSElemType;
#defineSTACK_INIT_SIZE100
#defineSTACKINCREMENT10
typedefstruct
{
unsignedintweight;
unsignedintparent,lchild,rchild;
}HTNode,*HuffmanTree;
typedefchar**HuffmanCode;
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn);
voidSelect(HuffmanTree&HT,intn,int&s1,int&s2);
/*hefumanbianma.cpp
顺序表函数的实现文件
主要功能:
......
*/
#include"preConst.h"
#include"hefumanbianma.h"
#include
#include
#include
#include
voidHuffmanCoding(HuffmanTree&HT,HuffmanCode&HC,int*w,intn)
{
if(n<=1)
return;
intm,i;
ints1,s2;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
HuffmanTreep;
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
p->weight=*w;
p->parent=p->lchild=p->rchild=0;
}
for(;i<=m;++i,++p)
{
p->weight=p->parent=p->lchild=p->rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
intunsignedstart,c;
unsignedintf;
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
char*cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{
start=n-1;
for(c=i,f=HT[i].parent;f!
=0;c=f,f=HT[f].parent)
{
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
}
HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
voidSelect(HuffmanTree&HT,intn,int&s1,int&s2)
{
inti,j,k=1;
unsignedinta,b,c;
a=b;
HuffmanTreep;
p=HT+1;
for(i=1;i<=n;i++,p++)
{
if(p->parent==0)
{
if(k>2)
{
if(p->weight { s2=s1; b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 二叉 构造 遍历 应用程序