1、浙大城院数据结构report10浙江大学城市学院实验报告课程名称 数据结构基础 实验项目名称 实验十 二叉树的基本操作 学生姓名 专业班级 学号 实验成绩 指导老师(签名 ) 日期 三. 函数的功能说明及算法思路树的基本函数void InitBTree( BTreeNode *&BT ); /初始化二叉树BT int EmptyBTree( BTreeNode *BT); /检查二叉树BT是否为空,空返回1,否则返回0 int DepthBTree( BTreeNode *BT);/求二叉树BT的深度并返回该值 int FindBTree( BTreeNode *BT, ElemType x)
2、; /查找二叉树BT中值为x的结点,若查找成功返回1,否则返回0 void PreOrder( BTreeNode *BT);/先序遍历二叉树BTvoid InOrder( BTreeNode *BT);/中序遍历二叉树BTvoid PostOrder( BTreeNode *BT); /后序遍历二叉树BT void PrintBTree( BTreeNode *BT );/输出二叉树BT void ClearBTree( BTreeNode *&BT ); /清除二叉树BTvoid CreateBTree( BTreeNode *&BT, char *a)/根据字符串a所给出的广义表表示的二
3、叉树建立二叉链表存储结构 树的附加函数void LevelOrder( BTreeNode *BT ) /按层次遍历二叉树BT 定义并且初始化队列q if(树不空) 根结点入队; while(队列不空) BT =出队的元素 访问该结点 if (BT的左孩子不空) BT的左孩纸入队列; if (BT的右孩子不空) BT的右孩纸入队列; int Get_Sub_Depth( BTreeNode *T , ElemType x)/求二叉树中以元素值为x的结点为根的子树的深度 if(BT不是空) if(BT-data=x) 返回BT的深度; Else返回 Get_Sub_Depth(BT的左孩纸,x)
4、和Get_Sub_Depth(BT-的右孩纸,x)中的较大值 Else返回0;顺序栈的操作 (void CreateBTree( BTreeNode *&BT, char *a)/根据字符串a所给出的广义表表示的二叉树建立二叉链表存储结构 中要用到顺序栈的结构) void InitStack (Stack &S) /构造一个空栈 S int EmptyStack (Stack S) /若栈S为空栈返回1,否则返回0void Push(Stack &S, BTreeNode * item) /元素 item进栈 BTreeNode * Pop(Stack &S) /栈S的栈顶元素出栈并返回 BT
5、reeNode * Peek(Stack S) /取栈S的当前栈顶元素并返回 循环队列的操作 (void LevelOrder( BTreeNode *BT )按层次遍历二叉树B函数中要用到队列存储树中元素 )void InitQueue (Queue &Q) /初始化循环队列Q int EmptyQueue (Queue Q) /判断队列是否为空,空返回1,否则返回0 void EnQueue (Queue &Q , BTreeNode * item ) /进队列 BTreeNode * OutQueue(Queue &Q)/出队列 四. 实验结果与分析(包括运行结果截图、结果分析等)先定义
6、了一个二叉树,因为是空,所以输出”改二叉树为空”的信息之后输入广义表再定义为二叉树,再对二叉树进行一系列操作五. 心得体会(记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。)出错点:在binary_tree.h头文件中,对顺序栈以及队列的定义在树的定义之后,导致在编译中,先编译树的函数,调用顺序栈以及队列出错改正:将顺序栈以及队列的函数定义在树函数之前【附录-源程序】binary_tree.h/*顺序栈的操作*/ struct Stack BTreeNode *stack; / 存栈元素 int top; / 栈顶指示器 int MaxSize; / 栈的最大长度 ;
7、void InitStack (Stack &S) /构造一个空栈 S S.MaxSize=10; S.stack=(BTreeNode*)malloc(S.MaxSize *sizeof(BTreeNode *); if(!S.stack) cout分配空间失败endl; exit(1); S.top=-1; int EmptyStack (Stack S) /若栈S为空栈返回1,否则返回0 return S.top=-1; void Push(Stack &S, BTreeNode * item) /元素 item进栈 if(S.top=S.MaxSize-1) S.stack=(BTre
8、eNode*)realloc(S.stack,S.MaxSize*sizeof(BTreeNode *)*2); S.MaxSize*=2; S.top+; S.stackS.top=item; BTreeNode * Pop(Stack &S) /栈S的栈顶元素出栈并返回 BTreeNode * temp; if(S.top=-1) cout顺序链为空endl; exit(1); S.top-; temp=S.stackS.top+1; return temp; BTreeNode * Peek(Stack S) /取栈S的当前栈顶元素并返回 return S.stackS.top; /*循
9、环队列的操作*/ struct Queue BTreeNode *queue; int MaxSize; /队列最大存储数 int front; /头指针,若队列不空,指向队列头元素的前一个位置 int rear; /尾指针,若队列不空,指向队列尾元素 ; void InitQueue (Queue &Q) /初始化循环队列Q Q.MaxSize=20; Q.queue =(BTreeNode *)malloc(Q.MaxSize*sizeof(BTreeNode *); Q.rear=Q.front =0; int EmptyQueue (Queue Q) /判断队列是否为空,空返回1,否则
10、返回0 return Q.rear=Q.front; void EnQueue (Queue &Q , BTreeNode * item ) /进队列 if(Q.rear+1)%Q.MaxSize=Q.front )/空间不足,扩大2倍 int k=sizeof(BTreeNode *); Q.queue=(BTreeNode *)realloc(Q.queue,2*Q.MaxSize*k); if(Q.rear!=Q.MaxSize-1) /移动队列内容,必须要做 for(int i=0;idata = ai; p-lchild = p-rchild = NULL; if (BT= NULL
11、) BT = p; else t = Peek(s); if (k=1) t-lchild = p; else t-rchild = p; i+; int EmptyBTree( BTreeNode *BT) /检查二叉树BT是否为空,空返回1,否则返回0 return BT=NULL; int DepthBTree( BTreeNode *BT)/求二叉树BT的深度并返回该值 if(BT=NULL) /空树深度为0 return 0; else int dep1=DepthBTree(BT-lchild); /先求根结点左子树的深度 int dep2=DepthBTree(BT-rchild
12、); /再求根结点右子树的深度 if(dep1dep2) /返回最大值,并加上根结点这一层 return dep1+1; else return 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 Pre
13、Order( BTreeNode *BT) /先序遍历二叉树BT if(BT) coutdatalchild); /先序遍历左子树 PreOrder(BT-rchild); /先序遍历右子树 void InOrder( BTreeNode *BT) /中序遍历二叉树BT if(BT) InOrder(BT-lchild); /中序遍历左子树 coutdatarchild); /中序遍历右子树 void PostOrder( BTreeNode *BT) /后序遍历二叉树BT if(BT) PostOrder(BT-lchild); /后序遍历左子树 PostOrder(BT-rchild);
14、/后序遍历右子树 coutdata ; /访问根结点 void PrintBTree( BTreeNode *BT ) /输出二叉树BT if (BT) /树非空 coutdata; /输出根结点 if (BT-lchild != NULL | BT-rchild != NULL)/若非叶子结点,则递归调用输出左右子树 coutlchild ); if (BT-rchild != NULL) coutrchild ); coutlchild); /先递归删除左子树 ClearBTree(BT-rchild);/再递归删除右子树 free(BT); /最后释放根结点 BT=NULL;/根指针为空
15、 /*附加的操作*/按层次遍历二叉树BT void LevelOrder( BTreeNode *BT ) /按层次遍历: 利用队列, 每次访问队头结点,一旦访问某结点,它的左右孩子入队列,该结点出队列 Queue q; / 定义一个队列 InitQueue (q);/ 初始化队列 if(BT)/ 树不空 EnQueue (q,BT);/ 根结点入队 while(!EmptyQueue (q)/ 队列不空 BT = OutQueue(q); / 出队 coutdatalchild != NULL) EnQueue( q, BT-lchild ); if (BT-rchild != NULL)
16、EnQueue( q, BT-rchild ); int Depthx(BTreeNode *BT,ElemType x) int m,n; if(BT) if(BT-data=x) return DepthBTree(BT); else m=Depthx(BT-lchild,x); n=Depthx(BT-rchild,x); return mn?m:n; else return 0; Test4_1.cpp#include #include #include typedef char ElemType; struct BTreeNode ElemType data; BTreeNode *
17、lchild; BTreeNode *rchild; ; #includebinary_tree.h void main() BTreeNode *T1,*T2,*T3; char ch80,x; /x用于存放查找的数据 InitBTree(T1); /初始化二叉树 cout基本功能测试endl; EmptyBTree(T1)?cout该二叉树为空endl:cout该二叉树非空endl;/判断二叉树t1是否为空 printf(请输入广义表:); gets(ch); /将广义表保存在ch字符串中 CreateBTree(T1,ch); /建立二叉树 EmptyBTree(T1)?cout该二叉树
18、为空endl:cout该二叉树非空endl; cout该树的深度为DepthBTree(T1)x; if(FindBTree(T1,x) cout该元素在二叉树中endl; cout且二叉树中以该元素结点为根的子树的深度为Get_Sub_Depth(T1,x)endl; else cout该元素不在二叉树中endl; cout先序序列:;/先序序列 PreOrder(T1); coutendl; cout中序序列:;/中序序列 InOrder(T1); coutendl; cout后序序列:;/后序序列 PostOrder(T1); coutendl; cout层序序列:;/层序序列 LevelOrder(T1); coutendl; cout输出二叉树:;/输出二叉树 PrintBTree(T1); coutendl; coutendl; ClearBTree(*&T1);/清除二叉树
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1