数据结构实验五_二叉树基本操作的编程实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_40833790/article/details/89491260

一、实验题目

二叉树基本操作的编程实现

二、题目要求

二叉树基本操作的编程实现,掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。也鼓励学生利用基本操作进行一些应用的程序设计。

三、运行结果

在这里插入图片描述

四、程序基本功能

1、先根递归遍历(DLR)

若二叉树为空,遍历结束。否则,先访问根结点;然后先根遍历根结点的左子树;再先根遍历根结点的右子树。
在这里插入图片描述

2、中根递归遍历(LDR)

若二叉树为空,遍历结束。否则,先进行中根遍历根结点的左子树;再访问根结点;再中根遍历根结点的右子树。
在这里插入图片描述

3、后根递归遍历(LRD)

若二叉树为空,遍历结束。否则,先进行后根遍历根结点的左子树;再后根遍历根结点的右子树;再访问根结点。
在这里插入图片描述

4、先根非递归遍历

二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。

5、中根非递归遍历

二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。

6、后根非递归遍历

由于必须先把两个孩子都访问完毕,才可以访问“根”,为了保留返回地址,所以必然进栈两次,但并不是任何结点总有两个孩子,所以无法准确判断当前栈顶是左孩子还是右孩子,解决的方法有两种,一是启用两个栈,分别处理。二是约定结点要入两次栈,出两次栈,而访问结点是在第二次出栈时访问。因此,为了区别同一个结点指针的两次出栈,设置一标志flag=1,令flag=1代表第一次出栈,结点不能访问,flag=2代表第二次出栈,结点可以访问,当结点指针进、出栈时,其标志flag也同时进、出栈。因此,可将栈中元素的数据类型定义为指针和标志flag合并。定义如下:

Class stackdata			//创建一个stackdata类,在非递归遍历算法中需要
{
	friend class btree;
	private:
		node *link;
		int  flag;
	public:
		stackdata()  {} ;
		~stackdata()  {};
};

7、层次遍历

二叉树的层次遍历是指从二叉树的第一层开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
在这里插入图片描述

五、部分源码

这次实验相对于来说有点困难,所以老师直接给了我们源代码

/*
需要把所有遍历的函数补上,确保功能正确。
自己需要画至少四层的二叉树,然后手工写出各种遍历结果,
然后用计算机建立相应的二叉树,通过程序看看结果是否一样,
然后把这些资料都做到实验报告中去。
*/

/*功能描述:
      1. 建立二叉树三种方法(广义表形式内置、键盘输入广义表和逐个数据构建)。
	  2. 输出二叉树两种方法(广义表形式和缩格形式)。
	  3. 二叉树多种遍历(递归三种、非递归三种、层次遍历共七种,使用线性表逻辑结构输出。
	  4. 二叉树内全部数据信息显示。
	  2. 增加、删除和查找数据结点。
	  3. 提供当前工作指针的转移(移至左儿子、移至右儿子、移至父亲和移至树根、移至被查找对象)
*/

#include<windows.h>
#include<iostream>
#include<iomanip>
#include<fstream>
using namespace std;
enum returninfo {success,fail,overflow,underflow,nolchild,norchild,nofather,havesonl,havesonr,
                 haveason,havetwosons,range_error,quit
                };					//定义返回信息清单
#define Maxsize 100									//定义广义表数组的长度
char defaultbtree1[]="a(b,c(,d))";					//默认广义表数据表示的二叉树范例1
char defaultbtree2[]="a(b(c(d,e),f(,g)),h(i,j))";	//默认广义表数据表示的二叉树范例2
class node {
		friend class btree;//二叉树类的友元类
	public:
		node(char initdata='0',int initdeep=0,node *initl=NULL,node *initr=NULL,
		     node *initf=NULL,node *initn=NULL);
		~node() {};
	protected:
		char data;		//二叉树结点中的数据,此处定义为字符
		int	 deep;		//设置二叉树结点的深度
		node *lchild;	//左儿子
		node *rchild;	//右儿子
		node *father;	//父亲结点
		node *next;		//用单链表处理所有结点时指向下一个结点
};
node::node(char initdata,int initdeep,node *initl,node *initr,node *initf,node *initn) {
	data=initdata;
	deep=initdeep;
	lchild=initl;
	rchild=initr;
	father=initf;
	next=initn;
}
class stackdata { //创建一个stackdata类,在非递归遍历算法中需要
		friend class btree;
	private:
		node *link;
		int  flag;
	public:
		stackdata()  {};
		~stackdata() {};
};
class btree { //创建一个二叉树类
	private:
		char btreedata[Maxsize];		//广义表字符数组
		char answer;					//用于回答菜单选项
		node *root;						//指向根结点位置的指针
		node *workinp,*linkrear;		//定义一个工作指针,尾部指针
		int  btreecount;				//结点个数计数器
		bool firstbracket;				//显示广义表时处理第一个括号,为1是,变成0就不是了
		int  countnow;					//每一次需要使用计数器时临时保存该值
		int  leafcount;
		int  countall;
		int	 sondeep;					//创建儿子结点时保存当前深度
	public:
		btree(node *initrootp);
		btree() {
			root=NULL;
			firstbracket=1;
			countall=0;					//递归函数内部统计结点个数
			btreecount=0;               //二叉树统计后的结点个数
		};
		~btree() {};
		void initfirstbracket();		//把第一个括号标志位恢复成1
		returninfo createbtree(int choice); //根据广义表字符串生成二叉树,choice=1为默认数据,2为键盘输入
		returninfo createroot();		//建立树根函数
		void visit(node *searchp);      //访问当前结点数据域
		void showbtreedata();			//在主界面中显示当前工作数组
		int  rgetcount(node *searchp);  //递归统计二叉树中的结点个数
		int  getcount();				//记录二叉树中的结点个数
		returninfo changeworkinpp();    //将工作指针指向左儿子、右儿子或者父亲
		returninfo findnode();			//查找结点
		returninfo addchild();          //增加左儿子或者右儿子
		returninfo deletenode();        //删除结点
		returninfo getinformation();    //获取二叉树结点和叶子信息
		returninfo gliststravel(node *searchp);//以广义表glists表示法输出二叉树
		returninfo indenttravel(node *searchp);//以凹入indent表示法输出二叉树
		returninfo preorder    (node *searchp);//递归先根遍历
		returninfo inorder     (node *searchp);//递归中根遍历
		returninfo postorder   (node *searchp);//递归后根遍历
		returninfo nrpreorder  (node *searchp);//非递归先根遍历
		returninfo nrinorder   (node *searchp);//非递归中根遍历
		returninfo nrpostorder (node *searchp);//非递归后根遍历
		returninfo levelorder  (node *searchp);//层次遍历
};

全部源码下载地址:https://download.csdn.net/download/qq_40833790/11141293

猜你喜欢

转载自blog.csdn.net/qq_40833790/article/details/89491260
今日推荐