当前位置:文档之家› 实验10 二叉树的基本操作

实验10 二叉树的基本操作

浙江大学城市学院实验报告课程名称数据结构基础实验项目名称实验十二叉树的基本操作学生姓名专业班级学号实验成绩指导老师(签名)日期2014-12-18一.实验目的和要求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 );//清除二叉树BT2、选做:实现以下说明的操作函数,要求把函数添加到头文件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服务器上自己的文件夹下。

三. 函数的功能说明及算法思路(包括每个函数的功能说明,及一些重要函数的算法实现思路)ADT GeneralTree isData:二元组 ( D , R )D是具有相同特性的数据元素的集合。

数据关系R为:当 n > 0(非空树)时,满足下列条件:①有且仅有一个结点没有前驱,此结点称为根。

②除根以外,其余结点有且仅有一个前驱结点。

③所有结点可以有任意多个(含0个)后继。

Operations:void InitBTree( BTreeNode *&BT ); //初始化二叉树BTvoid CreateBTree( BTreeNode *&BT, char *a ); //根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构int EmptyBTree( BTreeNode *BT); //检查二叉树BT是否为空,空返回1,否则返回0int DepthBTree( BTreeNode *BT);//求二叉树BT的深度并返回该值int FindBTree( BTreeNode *BT, ElemType x); //查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0void PreOrder( BTreeNode *BT);//先序遍历二叉树BTvoid InOrder( BTreeNode *BT);//中序遍历二叉树BTvoid PostOrder( BTreeNode *BT); //后序遍历二叉树BTvoid PrintBTree( BTreeNode *BT ); //输出二叉树BTvoid ClearBTree( BTreeNode *&BT ); //清除二叉树BTend GeneralTree四. 实验结果与分析(包括运行结果截图、结果分析等)五. 心得体会(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

)【附录----源程序】test4_1.cpp:#include<stdio.h>#include<iostream.h>#include<stdlib.h>typedef char ElemType;#include "binary_tree.h"void main(){BTreeNode* BT;InitBTree(BT);char b[50];cout<<"输入二叉树广义表字符串:"<<endl;cin.getline(b,sizeof(b));CreateBTree(BT,b);cout<<"前序遍历:";PreOrder(BT); cout<<endl;cout<<"中序遍历:";InOrder(BT); cout<<endl;cout<<"后序遍历:";PostOrder(BT); cout<<endl;cout<<"广义表形式遍历:";PrintBTree(BT); cout<<endl;cout<<"按层遍历:";LevelOrder(BT); cout<<endl;ElemType x,y;cout<<"输入一个需要查找的字符:";cin>>x;if(FindBTree(BT,x)){cout<<"查找字符"<<x<<"成功!"<<endl;cout<<"该字符的深度为:";cout<<DepthBTree(BT)<<endl;}elsecout<<"查找字符"<<x<<"失败,该字符不存在!"<<endl;cout<<"输入一个元素(以该元素的结点为根):";cin>>y;cout<<"以"<<y<<"的结点为根的子树的深度为:";cout<<Get_Sub_Depth(BT,y)<<endl;ClearBTree(BT);}binary_tree.h:struct BTreeNode {ElemType data; // 结点值域BTreeNode *lchild , *rchild ; // 定义左右孩子指针} ;void InitBTree( BTreeNode *&BT ){//初始化二叉树BTBT=NULL;}void CreateBTree( BTreeNode *&BT, char *a ){//根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构const int MaxSize=10; //栈数组长度>=二叉树的深度减1 BTreeNode* s[MaxSize]; //s数组作为存储根结点指针的栈使用int top=-1; //top为栈顶指针,表示栈空BTreeNode *p; //二叉树结点指针int k,i=0; //k=1时处理左子树,k=2处理右子树while(a[i]){switch(a[i]){case ' ':break;case '(':if(top==MaxSize-1){cout<<"栈空间太小,请增加MaxSize的值!"<<endl;exit(1);}top++;s[top]=p; k=1;break;case ')':if(top==-1){cout<<"二叉树广义表字符串错!"<<endl;exit(1);}top--;break;case ',':k=2;break;default:p=new BTreeNode;p->data=a[i];p->lchild=p->rchild=NULL;if(BT==NULL)BT=p;else{if(k==1) s[top]->lchild=p;else s[top]->rchild=p;}}i++;}}int EmptyBTree( BTreeNode *BT){//检查二叉树BT是否为空,空返回1,否则返回0return BT==NULL;}int DepthBTree( BTreeNode *BT){//求二叉树BT的深度并返回该值if (BT==NULL)return 0;else{int dep1 = DepthBTree(BT->lchild);int dep2 = DepthBTree(BT->rchild);if (dep1>dep2)return dep1+1;elsereturn dep2+1;}}int FindBTree( BTreeNode *BT, ElemType x){//查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0 if(BT==NULL) return 0;else{if (BT->data==x) //先与根结点相比,若不同再去左右子树查找 return 1;else{if (FindBTree(BT->lchild, x)) return 1;if (FindBTree(BT->rchild, x)) return 1;return 0;}}}void PreOrder( BTreeNode *BT){//先序遍历二叉树BTif(BT!=NULL){cout<<BT->data<<' ';PreOrder(BT->lchild);PreOrder(BT->rchild);}}void InOrder( BTreeNode *BT){//中序遍历二叉树BTif(BT!=NULL){InOrder(BT->lchild);cout<<BT->data<<' ';InOrder(BT->rchild);}}void PostOrder( BTreeNode *BT){//后序遍历二叉树BTif(BT!=NULL){PostOrder(BT->lchild);PostOrder(BT->rchild);cout<<BT->data<<' ';}}void PrintBTree( BTreeNode *BT ){//输出二叉树BTif(BT!=NULL){cout<<BT->data; //输出根结点if (BT->lchild!=NULL || BT->rchild!=NULL){//若非叶子结点,则递归调用输出左右子树cout<<'(';PrintBTree(BT->lchild);if(BT->rchild!=NULL){cout<<',';PrintBTree(BT->rchild);}cout<<')';}}}void ClearBTree(BTreeNode *&BT){//清除二叉树BTif(BT!=NULL){ClearBTree(BT->lchild);ClearBTree(BT->rchild);free(BT);BT=NULL;}}void LevelOrder( BTreeNode *BT ){//二叉树的层序遍历const int MaxSize=30; //定义用于存储队列的数组长度BTreeNode* q[MaxSize]; //数组空间int front=0,rear=0;BTreeNode* p;if(BT!=NULL){ //根指针进队rear=(rear+1)%MaxSize;q[rear]=BT;}while(front!=rear){front=(front+1)%MaxSize;p=q[front];cout<<p->data<<' ';if(p->lchild!=NULL){ //左孩子存在则左结点指针进队rear=(rear+1)%MaxSize;q[rear]=p->lchild;}if(p->rchild!=NULL){ //右孩子存在则右结点指针进队rear=(rear+1)%MaxSize;q[rear]=p->rchild;}}}int Get_Sub_Depth( BTreeNode *T , ElemType x){//求二叉树中以元素值为x的结点为根的子树的深度if(T){if(T->data==x)return DepthBTree(T);else{int dep1=Get_Sub_Depth(T->lchild,x);int dep2=Get_Sub_Depth(T->rchild,x);if(dep1>dep2) return dep1;else return dep2;}}else return 0;}。

相关主题