本科课程【数据结构与算法】实验3——二叉树的先序、中序、后序遍历操作

x33g5p2x  于2022-03-16 转载在 其他  
字(2.8k)|赞(0)|评价(0)|浏览(264)

大家好,我是【1+1=王】, 热爱java的计算机(人工智能)渣硕研究生在读。
如果你也对java、人工智能等技术感兴趣,欢迎关注,抱团交流进大厂!!!
Good better best, never let it rest, until good is better, and better best.

近期会把自己本科阶段的一些课程设计、实验报告等分享出来,供大家参考,希望对大家有帮助。

博客更新至专栏【课程设计实验报告】:https://blog.csdn.net/weixin_43598687/category_11640051.html

一、 实验目的

  1. 掌握二叉树的链式存储结构
  2. 实现二叉树的先序遍历操作
  3. 实现二叉树的中序遍历操作
  4. 实现二叉树的后序遍历操作

二、 实验内容

1. 实验任务

1)打印二叉树
2)完成二叉树的先序、中序、后序遍历操作

2. 程序设计

1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
从键盘输入,二叉树的节点元素值;

分别输出二叉树前序、中序、后序遍历的结果。
2) 数据存储(输入数据在内存中的存储)
定义二叉树结构体:

//二叉树结构体的定义
typedef struct Node
{
	char data;                            //定义一个字符型的元素
	struct  Node  *lchild;                    //定义一个左孩子,指针类型
	struct  Node  *rchild;                     //定义一个右孩子,指针类型
}Node, *BiTree;                               //BiTree是结构体的指针

使用二叉树的链式存储结构进行节点存储

3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。根----->左------->右

中序遍历:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树。左----->根------->右

后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子结点后结点的方式遍历访问左右子树,最后访问根结点。左------>右------>根

4) 数据输出(贴图:程序运行结果截图。图幅大小适当,不能太大)

三、 实验环境

  1. 操作系统:WINDOWS 10
  2. 开发工具:VC++ 2013
  3. 实验设备:PC

四、源代码

#include<iostream>
#include<malloc.h>
using namespace std;

//二叉树结构体的定义
typedef struct Node
{
	char data;                            //定义一个字符型的元素
	struct  Node  *lchild;                    //定义一个左孩子,指针类型
	struct  Node  *rchild;                     //定义一个右孩子,指针类型
}Node, *BiTree;                               //BiTree是结构体的指针

void create(BiTree &bt);
void  visit(BiTree bt);
void PreOder(BiTree  bt);
void InOder(BiTree bt);
void  PostOrder(BiTree bt);
void DeleteTree(BiTree bt);

int main()
{
	BiTree bt = NULL;                     //创建一个二叉树指针类型的对象
	cout << "创建以下二叉树:" << endl;
	cout << "          a" << endl;
	cout << "      /        \\" << endl;
	cout << "     b           c" << endl;
	cout << "  /     \\    /      \\" << endl;
	cout << " d       e   f       g" << endl;
	cout << "/ \\    / " << endl;
	cout << "h   i  j" << endl;
	cout << "输入结点二叉树节点数据:abdh i ej cf g:" << endl;
	//create(bt);                             //创建二叉树
	cout << "先序排序后的结果为:abdhiejcfg" << endl;
	//PreOder(bt);                             //调用先序排序函数
	cout << endl;
	cout << "中序排序后的结果为:hdibjeafcg" << endl;
	//InOder(bt);                                //调用中序排序函数
	cout << endl;
	cout << "后序排序后的结果为:hidjebfgca" << endl;
	//PostOrder(bt);                                //调用后序排序函数

	system("pause");
	return 0;
}

//创建函数,构建二叉树
void create(BiTree &bt)
{
	char ch;
	cin >> ch;
	if (ch == ' ')
	{
		bt = NULL;
	}
	else
	{
		bt = (Node *)malloc(sizeof(Node));
		bt->data = ch;                     //把得到的值作为该位置的元素
		create(bt->lchild);                   //创建左孩子
		create(bt->rchild);                //创建 右孩子
	}
}

void  visit(BiTree bt)
{
	cout << bt->data;
}

//先序遍历
void PreOder(BiTree  bt)
{
	if (bt)                                //判断该位置是否存在
	{
		visit(bt);                            //如果该位置存在,则输出
		PreOder(bt->lchild);                    //对左孩子进行先序遍历
		PreOder(bt->rchild);                    //对右孩子进行先序遍历
	}
}

//中序遍历
void InOder(BiTree bt)
{
	if (bt)
	{
		InOder(bt->lchild);                       //对左孩子进行中序遍历
		visit(bt);                               //打印出根结点
		InOder(bt->rchild);                        //对左孩子进行中序遍历
	}
}

//后序遍历
void  PostOrder(BiTree bt)
{
	if (bt)
	{

		PostOrder(bt->lchild);                         //对左孩子进行后序遍历
		PostOrder(bt->rchild);                        //对左孩子进行后序遍历
		visit(bt);                                   //打印出根结点
	}
}

void DeleteTree(BiTree bt)
{
	//
	// 利用递归实现后序遍历算法
	//
	if (bt != NULL)
	{
		DeleteTree(bt->lchild);
		DeleteTree(bt->rchild);

		free(bt);
	}
}

相关文章