完整word版二叉树基本操作 实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、实验目的
实验报告 1、 熟悉二叉树树的基本操作。
2、 掌握二叉树的实现以及实际应用。
3、 加深二叉树的理解,逐步培养解决实际问题的编程能力。
二、实验环境 1 台 WINDOWS 环境的 PC 机,装有 Visual C++ 6.0。
三、实验内容
【问题描述】
现需要编写一套二叉树的操作函数, 以便用户能够方便的利用这些函数来实现自己的应用。
其中操作函数包括: 创建二叉树CreateBTNode(*b,*str):根据二叉树括号表示法的字符串
*str 生成对应的链 式存储结构。
输出二叉树 DispBTNode(*b):以括号表示法输出一棵二叉树。
查找结点FindNode(*b,x):在二叉树b 中寻找data 域值为x 的结点,并返回指向该结点 的指针。
求高度BTNodeDepth(*b):求二叉树b 的高度。
若二叉树为空,则其高度为0;否则,其 高度等于左子树与右子树中的最大高度加 求二叉树的结点个数 先序遍历的递归算法: 中序遍历的递归算法: 后序遍历递归算法: 1> 2> 3> 4>
5> 6>
7> 8>
9> NodesCou nt(BTNode *b) void P reOrder(BTNode *b) void In Order(BTNode *b) void P ostOrder(BTNode *b) 层次遍历算法 void LevelOrder(BTNode *b) 【基本要求】
实现以上9个函数。
主函数中实现以下功能: 创建下图中的树b 输出二叉树b 找到''节点,输出其左右孩子值 输出b 的高度
输出b 的节点个数
A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))
程序:
#in elude <stdio.h>
#in elude <malloc.h> #defi ne MaxSize 100 typ edef char ElemT ype;
typ edef struct node
{
ElemT ype data; struct
node *lchild; struct node
*rchild;
} BTNode; /*数据元素*/ /*指向左孩子*/ /*指向右孩子*/
void CreateBTNode(BTNode *&b,char *str);// 创建 BTNode *Fi ndNode(BTNode *b,ElemTy pe x);// 查找节点 int BTNodeHeight(BTNode *b);// 求高度
void Dis pBTNode(BTNode *b);// 输出
int NodesCount(BTNode *b);// 二叉树的结点个数
void PreOrder(BTNode *b);// 先序遍历递归
void InOrder(BTNode *b);// 中序遍历递归
void PostOrder(BTNode *b);// 后序遍历递归
void LevelOrder(BTNode *b);// 层次遍历
〃创建
void CreateBTNode(BTNode *&b,char *str){
BTNode *St[MaxSize],* p=NULL;
int top=-1,k,j=O;
char ch;
输出b 的四种遍历顺序 上图转 叉树括号表示法为
b=NULL;
ch=str[j];
while(ch!='\0'){
switch(ch){
case '(':t op++;St[t op]=p ;k=1;break;
case ')':t op--;break;
case ',':k=2;break;
default: p=(BTNode *)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p-> rchild=NULL; if(b==NULL) b=p;
else{
switch(k){
case 1:St[t op]->lchild=p ;break;
case 2:St[t op]->rchild=p ;break;
}
}
} j++;
ch=str[j];
}
}
//输出
void Dis pBTNode(BTNode *b){
if(b!=NULL){
prin tf("%c",b->data);
if(b->lchild!=NULL||b->rchild!=NULL){
prin tf("(");
Dis pBTNode(b->lchild); if(b->rchild!=NULL)
prin tf(",");
Dis pBTNode(b->rchild); prin tf(")");
〃查找节点
BTNode *Fin dNode(BTNode *b,ElemTy pe x){
BTNode *p;
if(b==NULL)
return b;
else if(b->data==x)
return b;
else{
p=Fi ndNode(b->lchild,x);
if(p !=NULL)
return p;
else
retur n Fin dNode(b->rchild,x);
//求高度
int BTNodeHeight(BTNode *b){ int lchildh,rchildh; if(b==NULL)
return (0);
else{
lchildh=BTNodeHeight(b->lchild); rchildh=BTNodeHeight(b->rchild); return(lchildh>rchildh)?(lchildh+1):(rchildh+1);
〃二叉树的结点个数
int NodesCou nt(BTNode *b){ if(b==NULL)
return 0;
else
return NodesCou nt(b->lchild)+NodesCou nt(b->rchild)+1;
//先序遍历递归
void P reOrder(BTNode *b){ if(b!=NULL){
prin tf("%c",b->data); P
reOrder(b->lchild); P
reOrder(b->rchild);
〃中序遍历递归
void InO rder(BTNode *b){ if(b!=NULL){
InO rder(b->lchild); prin tf("%c",b->data); InO rder(b->rchild);
}
}
//后序遍历递归
void P ostOrder(BTNode
*b){ if(b!=NULL){
P ostOrder(b->lchild);
P ostOrder(b->rchild); prin tf("%c",b->data);
}
}
//层次遍历
void LevelOrder(BTNode *b){
BTNode *p;
BTNode *qu[MaxSize];
int fron t,rear;
fron t=rear=-1;
rear++;
qu[rear]=b;
while(fro nt!=rear){
fron t=(fro nt+1)%MaxSize;
p=qu[fron t];
prin tf("%c", p->data);
if(p->lchild!=NULL){
rear=(rear+1)%MaxSize; qu[rear]=p->lchild;
}
if(p->rchild!=NULL){ rear=(rear+1)%MaxSize; qu[rear]=p-> rchild; void mai n()
BTNode *b,* p, *l p,*rp;
char str[]="A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,l)))";// 根据树形图改写成的
〃二叉树括号表示法的字符串 *str
//char str[100];sca nf("%s",& str);// 自行输入括号表示的二叉树
CreateBTNode(b,str); // 创建树 b prin tf("\n");
printf (”输出二叉树:");//输出二叉树b
Dis pBTNode(b);
prin tf("\n");
printf("'H'结点:");//找到'H'节点,输出其左右孩子值 p=Fi ndNode(b,'H');
prin tf("\n");
if (p !=NULL){
printf("左孩子节点的值");
prin tf("%c", p->lchild->data); prin tf("\n");
printf("右孩子节点的值");
prin tf("%c", p->rchild->data); prin tf("\n");
//此处输出p 的左右孩子节点的值
}
prin tf("\n");
printf (” 二叉树 b 的深度:%d\n",BTNodeHeight(b));// 输出 b 的高度 printf (”二叉树b 的结点个数:%
d\n",NodesCount(b));//输出b 的节点个数 prin tf("\n");
先序遍历序列:\n");//输出b 的四种遍历顺序
算法:");PreOrder(b);printf("\n"); 中序遍历序列:\n"); 算法:");InOrder(b);printf("\n"); 后序遍历序列:\n"); 算法:");PostOrder(b);printf("\n"); 层次遍历序列:\n"); 算法:”);LevelOrder(b); printf("\n");
printf (”
printf (”
printf (”
printf (”
printf (”
printf (”
printf (”
四、实验心得与小结
通过实验,我熟悉二叉树树的基本操作,掌握二叉树的实现以及实际应用。
加深了对二叉树的理解,逐步培养解决实际问题的编程能力以及进一步了解了二叉树图转化为括号表示法。
递归的使用,要注意,初始时的状态以及如何使用递归,注意普遍性,思考时从普通的开始。
通过这次上机操作,让我明白书本上的程序一定要自己去调试,这样才能将书本程序与老师讲的内容融会贯通,达到温故而知新。
五、指导教师评议
指导教师签名:
成绩评定:。