数据结构实验五_二叉树基本操作的编程实现(C语言)

这篇博客介绍了如何使用C语言实现二叉树的基本操作,包括递归和非递归方式的先根、中根、后根遍历以及层次遍历。博主详细解释了各个遍历方法的逻辑,并提供了部分源码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、实验题目

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

二、题目要求

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

三、运行结果

在这里插入图片描述

四、程序基本功能

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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值