本科课程【数据结构与算法】实验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. 实验任务
1)打印二叉树
2)完成二叉树的先序、中序、后序遍历操作
2. 程序设计
1) 数据输入(输入哪些数据、个数、类型、来源、输入方式)
从键盘输入,二叉树的节点元素值;
分别输出二叉树前序、中序、后序遍历的结果。
2) 数据存储(输入数据在内存中的存储)
定义二叉树结构体:
//二叉树结构体的定义typedef struct Node{char data;//定义一个字符型的元素struct Node *lchild; //定义一个左孩子,指针类型struct Node *rchild;//定义一个右孩子,指针类型}Node, *BiTree; //BiTree是结构体的指针
使用二叉树的链式存储结构进行节点存储
3) 数据处理(说明处理步骤。若不是非常简单,需要绘制流程图)
前序遍历:若二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。根----->左------->右
中序遍历:若二叉树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),中序遍历根结点的左子树,然后访问根结点,最后中序遍历右子树。左----->根------->右
后序遍历:若二叉树为空,则空操作返回,否则从左到右先叶子结点后结点的方式遍历访问左右子树,最后访问根结点。左------>右------>根
4) 数据输出(贴图:程序运行结果截图。图幅大小适当,不能太大)
三、 实验环境
- 操作系统:WINDOWS 10
- 开发工具:VC++ 2013
- 实验设备: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);}}