树和二叉树实验报告.docx
- 文档编号:8983988
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:18
- 大小:118.62KB
树和二叉树实验报告.docx
《树和二叉树实验报告.docx》由会员分享,可在线阅读,更多相关《树和二叉树实验报告.docx(18页珍藏版)》请在冰豆网上搜索。
树和二叉树实验报告
●
实验内容:
实验三树和二叉树
1.编写函数,输入字符序列,建立二叉树的二叉链表。
2.编写函数,实现二叉树的中序递归遍历算法。
(最好也能实现前缀和后缀遍历算法)
3.编写函数,实现二叉树的中序非递归遍历算法。
4.编写函数,借助队列实现二叉树的层次遍历算法。
5.编写函数,求二叉树的高度。
6.编写函数,求二叉树的结点个数。
7.编写函数,求二叉树的叶子个数。
8.编写函数,交换二叉树每个结点的左子树和右子树。
9.编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法。
●实验目的及要求:
1.掌握二叉树的存储实现
2.掌握二叉树的遍历思想
3.掌握二叉树的常见算法的程序实现
●实验内容、方法与步骤:
(使用附页填写并附在本页后)
见附页
●实验结果:
见附页
●小结:
通过本次实验,我基本掌握了二叉树的存储实现和二叉树的遍历思想,
并且实现了二叉树的几种常见算法。
分数:
批阅老师:
200年月日
第1页/共13页
实验报告(附页)
#include
#include
#defineOK1
#defineERROR0
#defineOVERFLOW-2
typedefintstatus;
typedefstructBiNode//二叉链表
{
charData;
structBiNode*lChild;
structBiNode*rChild;
}BiNode,*pBiNode;
typedefstructSNode/*链栈的结点类型*/
{
pBiNodeelem;/*栈中的元素是指向二叉链表结点的指针*/
structSNode*next;
}SNode;
structlink//队列链表
{
structBiNode*p;
structlink*next;
};
statusCreateTree(BiNode**pTree);
statusPreOrderTraval(BiNode*pTree);//前序递归
statusInOrderTraval(BiNode*pTree);//中序递归
statusPostOrderTraval(BiNode*pTree);//后序递归
statusst_InOrderTraverse(BiNode*pTree);//中序非递归遍历
voidTreeLink(BiNode*pTree);//队列实现层次遍历
intTreeHeight(BiNode*pTree);//二叉树的高度
intCount(BiNode*pTree);//结点个数
intTreeNumber(BiNode*pTree);//叶子个数
voidExchange(BiNode*pTree);//交换左右子树
statusVisit(charData);
voidDisplay(BiNode*pTree,intLevel);
BiNode*pRoot=NULL;
statusCreateTree(BiNode**pTree)/*InputExample:
abd##e##cf##g##*/
{
charch;
scanf("%c",&ch);
if(ch=='#')
{
(*pTree)=NULL;
}
else
{
if(!
((*pTree)=(BiNode*)malloc(sizeof(BiNode))))
{
exit(OVERFLOW);
}
(*pTree)->Data=ch;
CreateTree(&((*pTree)->lChild));
CreateTree(&((*pTree)->rChild));
}
returnOK;
}
statusPreOrderTraval(BiNode*pTree)//前序递归
{
if(pTree)
{
if(Visit(pTree->Data))
{
if(PreOrderTraval(pTree->lChild))
{
if(PreOrderTraval(pTree->rChild))
{
returnOK;
}
}
}
returnERROR;
}
else
{
returnOK;
}
}
statusInOrderTraval(BiNode*pTree)//中序递归
{
if(pTree)
{
if(InOrderTraval(pTree->lChild))
{
if(Visit(pTree->Data))
{
if(InOrderTraval(pTree->rChild))
{
returnOK;
}
}
returnERROR;
}
returnERROR;
}
else
{
returnOK;
}
}
statusPostOrderTraval(BiNode*pTree)//后序递归
{
if(pTree)
{
if(PostOrderTraval(pTree->lChild))
{
if(PostOrderTraval(pTree->rChild))
{
if(Visit(pTree->Data))
{
returnOK;
}
returnERROR;
}
}
returnERROR;
}
else
{
returnOK;
}
}
statusst_InOrderTraverse(BiNode*pTree)//中序非递归遍历
{
BiNode*p;
SNode*q,*Stop=NULL;/*用不带头结点的单链表作为栈的存储结构*/
p=pTree;
while(p!
=NULL||Stop!
=NULL)/*不是空树*/
{
if(p!
=NULL)
{
q=(SNode*)malloc(sizeof(SNode));
if(q==NULL)returnERROR;
q->next=Stop;
q->elem=p;
Stop=q;/*根结点指针入栈*/
p=p->lChild;/*进入根的左子树*/
}
else
{
q=Stop;Stop=Stop->next;/*栈顶元素出栈*/
printf("%c",q->elem->Data);/*访问根结点*/
p=q->elem->rChild;/*进入根的右子树*/
free(q);/*释放原栈顶元素的结点空间*/
}
}
returnOK;
}
voidTreeLink(BiNode*pTree)//队列实现层次遍历
{
structlink*head,*rear,*temp;
head=(structlink*)malloc(sizeof(structlink));
head->p=pTree;
head->next=NULL;
rear=head;
do{
if(head->p->lChild!
=NULL)
{
temp=(structlink*)malloc(sizeof(structlink));
temp->p=head->p->lChild;
temp->next=NULL;
rear->next=temp;
rear=temp;
}
if(head->p->rChild!
=NULL)
{
temp=(structlink*)malloc(sizeof(structlink));
temp->p=head->p->rChild;
temp->next=NULL;
rear->next=temp;
rear=temp;
}
temp=head;
printf("%c",head->p->Data);
head=head->next;
free(temp);
}
while(head!
=NULL);
}
intTreeHeight(BiNode*pTree)//二叉树的高度
{
inthl,hr;//左右子树的高度
if(pTree==NULL)
return0;
else
hl=TreeHeight(pTree->lChild);
hr=TreeHeight(pTree->rChild);
if(hl>hr)
return(hl+1);
else
return(hr+1);
}
intCount(BiNode*pTree)//结点个数
{
returnpTree==NULL?
0:
Count(pTree->lChild)+Count(pTree->rChild)+1;
}
intTreeNumber(BiNode*pTree)//叶子个数
{
if(pTree==NULL)
return0;
if(pTree->lChild==NULL&&pTree->rChild==NULL)
return1;
returnTreeNumber(pTree->lChild)+TreeNumber(pTree->rChild);//+1就可以求出结点个数
}
voidExchange(BiNode*pTree)//交换左右子树
{
BiNode*temp;
if(pTree->lChild!
=NULL||pTree->rChild!
=NULL)
{
temp=pTree->lChild;
pTree->lChild=pTree->rChild;
pTree->rChild=temp;
Exchange(pTree->lChild);
Exchange(pTree->rChild);
}
}
statusVisit(charData)
{
printf("%c",Data);
returnOK;
}
voidDisplay(BiNode*pTree,intLevel)//显示整个树
{
inti;
if(pTree==NULL)return;
Display(pTree->rChild,Level+1);
for(i=0;i { printf(""); } if(Level>=1) { printf("--"); } printf("%c\n",pTree->Data); Display(pTree->lChild,Level+1); } voidCmdList()//显示命令列表 { printf("\n_____________________________________________\n"); printf("请选择操作: \n"); printf("1.前序递归遍历\n");//前序递归遍历 printf("2.中序递归遍历\n");//中序递归遍历 printf("3.后序递归遍历\n");//后序递归遍历 printf("4.中序非递归遍历\n");//中序非递归遍历 printf("5.层次遍历\n");//层次遍历 printf("6.求二叉树高度\n");//二叉树高度 printf("7.求结点个数\n");//二叉树的结点个数 printf("8.求叶子个数\n");//二叉树的叶子个数 printf("9.交换左右子树\n");//交换左右子树 printf("0.退出程序\n");//退出 printf("\n______________________________________________\n"); } voidinit() { system("cls"); printf("*************************\n"); printf("实验三树和二叉树\n"); printf("03计本3班\n"); printf("樊海军2B0324151138\n"); printf("*************************\n"); printf("本程序实现二叉树的常见算法。 \n"); printf("=================================================================\n"); printf("请输入二叉树各元素: (例如abd##e##cf##g##)\n");//例如abd##e##cf##g## CreateTree(&pRoot); Display(pRoot,0); CmdList(); } voidReadCommand(char&c) { do{c=getchar();} while(c! ='0'&&c! ='1'&&c! ='2'&&c! ='3'&&c! ='4'&&c! ='5'&&c! ='6'&&c! ='7'&&c! ='8'&&c! ='9'); } voidInterpret(char&c) { switch(c) { case'1': { printf("\n前序递归遍历: \n"); PreOrderTraval(pRoot); CmdList(); break; } case'2': { printf("\n中序递归遍历: \n"); InOrderTraval(pRoot); CmdList(); break; } case'3': { printf("\n后序递归遍历: \n"); PostOrderTraval(pRoot); CmdList(); break; } case'4': { printf("\n中序非递归遍历: \n"); st_InOrderTraverse(pRoot); CmdList(); break; } case'5': { printf("\n层次遍历: \n"); TreeLink(pRoot); CmdList(); break; } case'6': { printf("\n二叉树高度: \n"); printf("%d\n",TreeHeight(pRoot)); CmdList(); break; } case'7': { printf("\n结点个数: \n"); printf("%d\n",Count(pRoot)); CmdList(); break; } case'8': { printf("\n叶子个数: \n"); printf("%d\n",TreeNumber(pRoot)); CmdList(); break; } case'9': { printf("\n交换左右子树: \n"); Exchange(pRoot); printf("\n交换后的二叉树: \n"); Display(pRoot,0); CmdList(); break; } case'0': printf("程序结束,按任意键退出! \n"); } } voidmain()//主函数 { charcmd; init(); do { ReadCommand(cmd); Interpret(cmd); } while(cmd! ='0'&&cmd! ='0'); } 分数: 批阅老师: 200年月日 第13页/共13页
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 二叉 实验 报告