二叉树基本操作的编程实现
二叉树基本操作的编程实现,掌握二叉树的建立、遍历、插入、删除等基本操作的编程实现,也可以进一步编程实现查找等操作,存储结构主要采用顺序或链接结构。也鼓励学生利用基本操作进行一些应用的程序设计。
若二叉树为空,遍历结束。否则,先访问根结点;然后先根遍历根结点的左子树;再先根遍历根结点的右子树。
若二叉树为空,遍历结束。否则,先进行中根遍历根结点的左子树;再访问根结点;再中根遍历根结点的右子树。
若二叉树为空,遍历结束。否则,先进行后根遍历根结点的左子树;再后根遍历根结点的右子树;再访问根结点。
二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。
二叉树以二叉链表存放,一维数组stack[maxsize]用以实现栈,变量top用来表示当前栈顶的位置。
由于必须先把两个孩子都访问完毕,才可以访问“根”,为了保留返回地址,所以必然进栈两次,但并不是任何结点总有两个孩子,所以无法准确判断当前栈顶是左孩子还是右孩子,解决的方法有两种,一是启用两个栈,分别处理。二是约定结点要入两次栈,出两次栈,而访问结点是在第二次出栈时访问。因此,为了区别同一个结点指针的两次出栈,设置一标志flag=1,令flag=1代表第一次出栈,结点不能访问,flag=2代表第二次出栈,结点可以访问,当结点指针进、出栈时,其标志flag也同时进、出栈。因此,可将栈中元素的数据类型定义为指针和标志flag合并。定义如下:
Class stackdata //创建一个stackdata类,在非递归遍历算法中需要
{
friend class btree;
private:
node *link;
int flag;
public:
stackdata() {} ;
~stackdata() {};
};
二叉树的层次遍历是指从二叉树的第一层开始,从上至下逐层遍历,在同一层中,则按从左到右的顺序对结点逐个访问。
这次实验相对于来说有点困难,所以老师直接给了我们源代码
/*
需要把所有遍历的函数补上,确保功能正确。
自己需要画至少四层的二叉树,然后手工写出各种遍历结果,
然后用计算机建立相应的二叉树,通过程序看看结果是否一样,
然后把这些资料都做到实验报告中去。
*/
/*功能描述:
1. 建立二叉树三种方法(广义表形式内置、键盘输入广义表和逐个数据构建)。
2. 输出二叉树两种方法(广义表形式和缩格形式)。
3. 二叉树多种遍历(递归三种、非递归三种、层次遍历共七种,使用线性表逻辑结构输出。
4. 二叉树内全部数据信息显示。
2. 增加、删除和查找数据结点。
3. 提供当前工作指针的转移(移至左儿子、移至右儿子、移至父亲和移至树根、移至被查找对象)
*/
#include
#include
#include
#include
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