数据库二叉树.docx
- 文档编号:27388406
- 上传时间:2023-06-30
- 格式:DOCX
- 页数:9
- 大小:27.64KB
数据库二叉树.docx
《数据库二叉树.docx》由会员分享,可在线阅读,更多相关《数据库二叉树.docx(9页珍藏版)》请在冰豆网上搜索。
数据库二叉树
学生实验报告
(课程名称:
数据结构与算法)
实验题目:
二叉树
班级学号姓名
地点指导教师
实验日期:
年5月28日
一、实验目的
1.掌握二叉树的结构特征,以及各种存储结构的特点及适用范围。
2.掌握用指针类型描述、访问和处理二叉树的运算。
二、实验环境
TurboC或是VisualC++
三、实验内容与要求
1.输入字符序列,建立二叉链表。
2.按先序、中序和后序遍历二叉树(递归算法)。
3.按某种形式输出整棵二叉树。
4.求二叉树的高度。
5.求二叉树的叶结点个数。
6.交换二叉树的左右子树。
7.借助队列实现二叉树的层次遍历。
8.在主函数中设计一个简单的菜单,调试上述算法,要求1-3必做,4-7为选做。
为了实现对二叉树的有关操作,首先要在计算机中建立所需的二叉树。
建立二叉树有各种不同的方法。
一种方法是利用二叉树的性质5来建立二叉树,输入数据时需要将结点的序号(按满二叉树编号)和数据同时给出:
(序号,数据元素)。
图4.1所示二叉树的输入数据顺序应该是:
(1,a),(2,b),(3,c),(4,d),(6,e),(7,f),(9,g),(13,h)。
另一种算法是主教材中介绍的方法,这是一个递归方法,与先序遍历有点相似。
数据的组织是先序的顺序,但是另有特点,当某结点的某孩子为空时以字符“#”来充当,也要输入。
这时,图4.1所示二叉树的输入数据顺序应该是:
abd#g###ce#h##f##。
若当前数据不为“#”,则申请一个结点存入当前数据。
递归调用建立函数,建立当前结点的左右子树。
4、实验过程及结果分析
二叉树表示为a+b*(c-d)-e/f若先序遍历此二叉树,按访问结点的先后次序将结点排列起来,可得到二叉树的先序序列为-+a*b-cd/ef类似地,中序遍历此二叉树,可得此二叉树的中序序列为a+b*c-d-e/f后序遍历此二叉树,可得此二叉树的后序序列为abcd-*+ef/-
#include"stdafx.h"
#include
#include
#include
#include
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR0
#defineINFEASIBLE-1
#defineOVERFLOW-2
typedefintStatus;
typedefcharTElemType;
typedefstructBiTNode
{
TElemTypedata;
structBiTNode*lchild,*rchild;//左右孩子子树
}BiTNode,*BiTree;
/////============
typedefBiTNode*SElemType;
//------栈的顺序存储表示------
#defineSTACK_INIT_SIZE100//存储空间初始分配量
#defineSTACKINCREMENT10//存储空间分配增量
//顺序栈的类型定义:
typedefstruct{
SElemType*base;//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;//栈顶指针
intstacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
//、顺序栈的操作算法
//建立一个空栈
StatusInitStack(SqStack&S){
//构造一个空栈S
S.base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);//存储分配失效
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
returnOK;
}//InitStack
//取栈顶元素
StatusGetTop(SqStackS,SElemType&e){
//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*(S.top-1);
returnOK;
}//GetTop
//压栈push
StatusPush(SqStack&S,SElemTypee){
//插入元素e为新的栈顶元素
if((S.top-S.base)>=S.stacksize){//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(SElemType));
if(!
S.base)exit(OVERFLOW);//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top++=e;
returnOK;
}//push
//出栈pop
StatusPop(SqStack&S,SElemType&e){
//若栈不为空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)returnERROR;
e=*--S.top;
returnOK;
}//Pop
//判断栈是否为空
intStackEmpty(SqStackS){
//若栈为空,则返回1,否则返回0
if(S.top==S.base)return
(1);
elsereturn(0);
}
////===========
StatusCreateBiTree(BiTree&T)//按先序次序输入二叉树中结点的值(一个字符),空格表示空树
{//构造二叉链表表示的二叉树T
charch;
scanf("%c",&ch);
if(ch=='#')T=NULL;
else
{
if(!
(T=(BiTNode*)malloc(sizeof(BiTNode))))exit(OVERFLOW);
T->data=ch;//生成根结点
CreateBiTree(T->lchild);//构造左子树
CreateBiTree(T->rchild);//构造右子树
}
returnOK;
}//CreatBiTree
StatusPreOrderTraverse(BiTreeT,Status(*visit)(TElemTypee))
{//递归先序遍历
if(T)
{
(*visit)(T->data);
PreOrderTraverse(T->lchild,visit);
PreOrderTraverse(T->rchild,visit);
}
returnOK;
}
StatusInOrderTraverse(BiTreeT,Status(*visit)(TElemTypee))
{//递归中序遍历
if(T)
{
InOrderTraverse(T->lchild,visit);
visit(T->data);
InOrderTraverse(T->rchild,visit);
}
returnOK;
}
StatusPostOrderTraverse(BiTreeT,Status(*visit)(TElemTypee))
{//递归后序遍历
if(T)
{
PostOrderTraverse(T->lchild,visit);
PostOrderTraverse(T->rchild,visit);
visit(T->data);
}
returnOK;
}
////================
StatusInOrderTraverseS(BiTreeT,Status(*visit)(TElemTypee))
{//递归中序遍历
SqStackS;
BiTreep;
InitStack(S);p=T;
while(p||!
StackEmpty(S)){
if(p){Push(S,p);p=p->lchild;}
else
{Pop(S,p);if(!
visit(p->data))returnERROR;
p=p->rchild;
}//else
}//while
returnOK;
}
/////////////////////////////
Statusvisit(TElemTypee)
{
printf("%c",e);
returnOK;
}
intBiTreeDepth(BiTreeT)
{//返回二叉树的深度
inti,j;
if(!
T)
return0;
if(T->lchild)
i=BiTreeDepth(T->lchild);
else
i=0;
if(T->rchild)
j=BiTreeDepth(T->rchild);
else
j=0;
returni>j?
++i:
++j;
}
intLeaf(BiTreeT)//求二叉树叶子结点数目
{
intn,m;
if(T==NULL)
return(0);
elseif((T->lchild==NULL)&&(T->rchild==NULL))
return
(1);//如果二叉树的左孩子和右孩子均为空,则返回1
else//如果二叉树的左孩子或右孩子不为空
{
n=Leaf(T->lchild);//求T的左子树的叶子结点数目
m=Leaf(T->rchild);//求T的右子树的叶子结点数目
return(n+m);//返回总的叶子结点数目
}//else
}
voidmain()
{
BiTreeT;
printf("按先序次序输入二叉树中结点的值(一个字符),空树结点用#代替:
\n");
CreateBiTree(T);
printf("依次先序中序后序输出:
\n");
PreOrderTraverse(T,visit);printf("\n");
InOrderTraverse(T,visit);printf("\n");
InOrderTraverseS(T,visit);printf("堆栈法-中序遍历\n");
PostOrderTraverse(T,visit);printf("\n");
printf("树的深度为:
%d\n",BiTreeDepth(T));
printf("树的叶子节点数为:
%d\n",Leaf(T));
}
五、成绩评定
优
良
中
及格
不及格
出勤
内容
格式
创新
效果
总评
指导教师:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 二叉
![提示](https://static.bdocx.com/images/bang_tan.gif)