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

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


大家好,我是【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#includeusing 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 << " de   fg" << 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" <> 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 <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);}}