二叉树的遍历

  • 一、实验目的或任务
  • 二、实验教学基本要求
  • 三、实验教学的内容或要求
    • 1. 编写函数,输入字符序列,建立二叉树的二叉链表
    • 2. 编写函数,实现二叉树的中序递归遍历算法。
    • 3. 编写函数,实现二叉树的中序非递归遍历算法
    • 4. 编写函数,借助队列实现二叉树的层次遍历算法
    • 5. 编写函数,求二叉树的高度
    • 6. 编写函数,求二叉树的结点个数
    • 7. 编写函数,求二叉树的叶子个数
    • 8. 编写函数,交换二叉树每个结点的左子树和右子树
    • 9. 编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法
  • 四、实验类型或性质
  • 五、实验开出要求
  • 六、实验所需仪器设备
  • 七、实验所用材料

实验项目中文名称:二叉树的遍历
实验项目英文名称:Binary tree traverse
实验项目编码:3
实验学时:5
适用专业:信息与计算科学、数学与应用数学
所属课程:数据结构
开课学院:理学院
开课学期:第5学期
教材及实验指导书:
耿国华主编,《数据结构—(第三版)》,电子工业出版社,2011年

一、实验目的或任务

通过指导学生上机实践,对常用数据结构的基本概念及其不同的实现方法的理论得到进一步的掌握,并对在不同存储结构上实现不同的运算方式和技巧有所体会。

二、实验教学基本要求

1.了解实验目的及实验原理;
2.编写程序,并附上程序代码和结果图;
3.总结在编程过程中遇到的问题、解决办法和收获。

三、实验教学的内容或要求

1. 编写函数,输入字符序列,建立二叉树的二叉链表

//按照前序遍历建立二叉树(字符'#'为空树)
TreeNode* PreOrderCreateTree(string& str, int& i)
{if (str[i] == '#')return nullptr;TreeNode *head = new TreeNode(str[i]);i++;head->left = PreOrderCreateTree(str, i);i++;head->right = PreOrderCreateTree(str, i);return head;
}

这里需要注意,使用先序去创建二叉树是可以的,如果想要使用后序或者中序的字符串是不行的,因为后序或者中序无法唯一确定一颗二叉树,所以想要创建二叉树还可以使用中序和后序字符串去创建或者前序和中序去创建。

2. 编写函数,实现二叉树的中序递归遍历算法。

//中序递归遍历(左根右)
void PastOrderShow1(TreeNode* head)
{if (head != nullptr){PastOrderShow1(head->left); cout << head->val << " ";   PastOrderShow1(head->right);}
}

递归遍历非常简单,只需要记住不同遍历方法,遍历结点的顺序即可

3. 编写函数,实现二叉树的中序非递归遍历算法

//中序非递归遍历
void PastOrderShow2(TreeNode* head)
{if (head == nullptr)return;stack<TreeNode*>st;while (!st.empty()||head){while (head){st.push(head);head = head->left;}head = st.top();cout << head->val << " ";st.pop();head = head->right;}
}

非递归遍历需要利用栈(这里我使用的是C++语言,所以使用的是STL容器中的stack,一个先进后出的容器)去完成,先将左孩子结点依次入栈,然后取栈顶元素进行遍历,在去将当前结点的右孩子依次入栈,其实细心的读者也会发现,这也就是中序遍历结点的顺序。

4. 编写函数,借助队列实现二叉树的层次遍历算法

void LevelShow(TreeNode* head)
{if (head == nullptr)return;queue<TreeNode*>qu;qu.push(head);while (!qu.empty()){TreeNode* top = qu.front();cout << top->val << " ";qu.pop();if (top->left)qu.push(top->left);if (top->right)qu.push(top->right);}
}

这里也是使用了一个STL中的一个先进先出的容器queue,通过每次去对头结点,然后读取,并且将该结点的左右孩子入队,从而达到一个层次遍历的效果

5. 编写函数,求二叉树的高度

int TreeHigh(TreeNode* root)
{if (root == nullptr)return 0;int lefthigh = TreeHigh(root->left);int righthigh = TreeHigh(root->right);return lefthigh > righthigh ? lefthigh + 1 : righthigh + 1;
}

这里非常简单,利用递归去求得左右子树的高度,从而选取最大高度再加上根节点即可。

6. 编写函数,求二叉树的结点个数

int CountNode(TreeNode* root)
{if (root == nullptr)return 0;int lefthigh = CountNode(root->left)+1;int righthigh = CountNode(root->right)+1;return lefthigh+righthigh-1;
}

利用递归去求左右子树的节点个数,然后减去一个重复的根节点,本题也可以使用的一个方法就是在遍历的途中(递归,非递归都可以)去计数也可以

7. 编写函数,求二叉树的叶子个数

int CountLeafNode(TreeNode* root)
{if (root == nullptr)return 0;if (root->left == nullptr&&root->right == nullptr)return 1;int lefthigh = CountLeafNode(root->left);int righthigh = CountLeafNode(root->right);return lefthigh + righthigh;
}

还是用过递归的方法去得到叶子结点(左右子树都为空)的个数

8. 编写函数,交换二叉树每个结点的左子树和右子树

void Swap(TreeNode* root)
{if (root == nullptr)return;TreeNode* cur;if (root->left&&root->right){cur = root->left;root->left = root->right;root->right = cur;}else if (root->left == nullptr&&root->right){root->left = root->right;root->right = nullptr;}else if (root->right == nullptr&&root->left){root->right = root->left;root->left = nullptr;}Swap(root->left);Swap(root->right);
}

这里先去根据不同情况交换根节点的左右子树,然后递归交换下面的结点

9. 编写一个主函数,在主函数中设计一个简单的菜单,分别调试上述算法

主函数大家自行练习

四、实验类型或性质

验证性

五、实验开出要求

必做

六、实验所需仪器设备

1.计算机
2.相关软件(如C,C++,PASCAL,VC,DELPHI等等)

七、实验所用材料

计算机耗材

二叉树的遍历(c语言数据结构实验报告三)相关推荐

  1. 图的遍历c语言数据结构实验报告,数据结构实验报告--图的遍历

    江 西 理 工 大 学 数据结构 实验报告 实验名称 图的遍历 日期 2014-12-01 专业班级 计算机(中加)131班 地点 信息学院621 实验人 王鹏伟 学号 同组人 单独完成 152013 ...

  2. 图的遍历c语言数据结构实验报告,数据结构图的遍历实验报告.doc

    数据结构图的遍历实验报告.doc 实 验 报 告课程名称 数据结构实验名称 图的遍历姓 名专 业 计算机科学与技术班 级 计算机学 号成绩计算机科学与技术学院实验教学中心2015 年 11 月 20 ...

  3. 数据结构实验报告三 二叉树

    一.实验目的 1.掌握二叉树的基本特性 2.掌握二叉树的先序.中序.后序的递归遍历算法 3.理解二叉树的先序.中序.后序的非递归遍历算法 4.通过求二叉树的深度.叶子结点数和层序遍历等算法,理解二叉树 ...

  4. 数据结构实验报告三:教材3.10Josephus(约瑟夫环)问题、多项式乘法问题的求解

    实验三:教材3.10Josephus(约瑟夫环)问题.多项式乘法问题的求解 问题一·教材3.10Josephus问题 1.实验描述 N个人从1到N编号,围坐成一个圆圈.从1号开始传递一个热土豆.经过M ...

  5. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  6. 厦门理工C语言实验报告8,厦门理工c语言数据结构实验

    <厦门理工c语言数据结构实验>由会员分享,可在线阅读,更多相关<厦门理工c语言数据结构实验(15页珍藏版)>请在人人文库网上搜索. 1.数据结构实验报告 实验序号:6 实验项目 ...

  7. 数据结构c语言版实验报告2,数据结构(C语言版) 实验报告 (2)

    <数据结构(C语言版) 实验报告 (2)>由会员分享,可在线阅读,更多相关<数据结构(C语言版) 实验报告 (2)(15页珍藏版)>请在人人文库网上搜索. 1.数据结构(C语言 ...

  8. C语言南邮数据结构实验报告2,南邮数据结构实验报告.docx

    南邮数据结构实验报告 实验报告 课程名称 实验名称数据结构二叉树基本操作以及哈夫曼编码译码系统 实验时间 指导单位指导教师年月日 学生姓名 学院(系) 班级学号专业 二叉树的基本运算: 一.问题描述 ...

  9. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

最新文章

  1. Linux shell编程学习笔记-----第十四章
  2. “EncoderDecoder: ‘mit_b1 is not in the backbone registry‘“
  3. ibm v5000增加磁盘_存储扩容首选 IBM Storwize V5000促销
  4. matlab语音去除白噪声_全国首款“AI语音电梯”亮相海淀医院、北医三院
  5. 常州网站服务器_常州服务器
  6. 【转】IT从业人员必看的10个论坛
  7. 牛逼!终于有人开源了一份基于SSM框架实现了支付宝支付功能的完整源代码......
  8. Qt Toast 一个淡出提示效果
  9. Flex应用性能优化
  10. Gitee使用(详细idea关联git)
  11. Matlab学习笔记之Matlab中括号用法
  12. STM32CubeMX:中断函数例题:2021-08-03
  13. 炮兵阵地图文详解NOI2001/POJ1185(状态压缩)
  14. 【Python】聊聊Python ctypes 模块
  15. 那缕清香,右手阑珊,左手寂寞
  16. 这些个适合oier的网站丫太有趣了吧(不定期更新中)
  17. linux 软链接 相对路径,Linux入门之ln命令创建软链接的绝对路径和相对路径详解(Ubuntu)...
  18. mysql免安装版linux_Linux下配置免安装版的MySQL
  19. Linux各目录介绍
  20. 高龄白菜java学习第109天(java数据结构和算法(27))

热门文章

  1. 西门子PLC基于MODBUS RTU通信协议时的寄存器地址对应关系及错误代码
  2. 孩子叛逆期不想上学怎么办
  3. vs2010设置堆栈大小
  4. matlab画多层网络图,复杂网络建模 社交网络图的一些计算代码(不全欢迎补充)MATLAB...
  5. python实现huffman编码_Python实现huffman编码
  6. PyCharm IDEA Runtime Error R6034解决方法
  7. processon使用教程
  8. 自定义View学习——九宫格解锁(LockPatternView)
  9. jmeter请求超时设置
  10. E+H 液位开关FTL31-AA4U2BAWDJ+JAZ1