二叉树的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
浙江大学城市学院实验报告
课程名称数据结构基础
实验项目名称实验十二叉树的基本操作
学生姓名吴奇专业班级信管1204 学号31201403
实验成绩指导老师(签名)日期
一.实验目的和要求
1、掌握二叉树的链式存储结构。
2、掌握在二叉链表上的二叉树操作的实现原理与方法。
3、进一步掌握递归算法的设计方法。
二.实验内容
1、按照下面二叉树二叉链表的存储表示,编写头文件binary_tree.h,实现二叉链表的定义与基本操作实现函数;编写主函数文件test4_1.cpp,验证头文件中各个操作。
二叉树二叉链表存储表示如下:
struct BTreeNode {
ElemType data; // 结点值域
BTreeNode *lchild , *rchild ; // 定义左右孩子指针
} ;
基本操作如下:
①void InitBTree( BTreeNode *&BT );
//初始化二叉树BT
②void CreateBTree( BTreeNode *&BT, char *a );
//根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构
③int EmptyBTree( BTreeNode *BT);
//检查二叉树BT是否为空,空返回1,否则返回0
④int DepthBTree( BTreeNode *BT);
//求二叉树BT的深度并返回该值
⑤int FindBTree( BTreeNode *BT, ElemType x);
//查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0
⑥void PreOrder( BTreeNode *BT);
//先序遍历二叉树BT
⑦void InOrder( BTreeNode *BT);
//中序遍历二叉树BT
⑧void PostOrder( BTreeNode *BT);
//后序遍历二叉树BT
⑨void PrintBTree( BTreeNode *BT );
//输出二叉树BT
⑩void ClearBTree( BTreeNode *&BT );
//清除二叉树BT
2、选做:实现以下说明的操作函数,要求把函数添加到头文件binary_tree.h 中,并在主函数文件test4_1.cpp中添加相应语句进行测试。
①void LevelOrder( BTreeNode *BT )
//二叉树的层序遍历
②int Get_Sub_Depth( BTreeNode *T , ElemType x)
//求二叉树中以元素值为x的结点为根的子树的深度
3、填写实验报告,实验报告文件取名为report10.doc。
4、上传实验报告文件report10.doc、源程序文件test4_1.cpp及binary_tree.h 到Ftp服务器上自己的文件夹下。
三. 函数的功能说明及算法思路
struct BtreeNode{
elemtype data; //结点值域
BtreeNode *lchild; //定义左孩子指针
BtreeNode *rchild; //定义右孩子指针
};
struct lnode{ //定义队列结点结构用于二叉树层遍历BtreeNode *data1;
lnode *next;
};
struct Queue{ //定义队列首尾指针
lnode *front;
lnode *back;
};
void initQueue(Queue &Q) //初始化队列
{
Q.front=Q.back=NULL;
}
void insertQueue(Queue &Q,BtreeNode *item) //元素入队列
{
lnode *newptr=new lnode;
newptr->data1=item;
newptr->next=NULL;
if(Q.back==NULL)
Q.front=Q.back=newptr;
else
Q.back=Q.back->next=newptr;
}
BtreeNode *deleteQueue(Queue &Q) //队首元素出队列
{
BtreeNode *temp=Q.front->data1;
lnode *p=Q.front;
Q.front=p->next;
if(Q.front==NULL)
Q.back=NULL;
delete p;
return temp;
}
bool emptyQueue(Queue Q) //判断队列是否为空
{
return Q.front==NULL;
}
void initBtree(BtreeNode *&BT) //二叉树的初始化
{
BT=NULL;
}
void insertBtree(BtreeNode *&BT) //创建二叉树
{
elemtype ch;
ch=getchar();
if(ch=='$') //判断是不是结束标志
BT=NULL;
else
{
BT=new BtreeNode; //创建结点
BT->data=ch; //赋值
insertBtree(BT->lchild); //左子叶递归
insertBtree(BT->rchild); //右子叶递归
}
}
bool emptyBtree(BtreeNode *BT) //判断二叉树是否为空
{
return BT==NULL;
}
int depthBtree(BtreeNode *BT) //求二叉树的深度
{
if(emptyBtree(BT))
return 0;
else{
int dep1=depthBtree(BT->lchild); //左子叶递归
int dep2=depthBtree(BT->rchild); //右子叶递归
return dep1>dep2?dep1+1:dep2+1; //判断哪个子叶的深度最大