二叉树的基本操作

  • 格式:doc
  • 大小:96.50 KB
  • 文档页数:11

下载文档原格式

  / 35
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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; //判断哪个子叶的深度最大