二叉树遍历课程实施方案(C++)含源代码_第1页
二叉树遍历课程实施方案(C++)含源代码_第2页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

个人收集整理 仅供参考 0 17 数据结构数据结构 课程设计报告课程设计报告 设计题目 设计题目 二叉树地遍历二叉树地遍历 姓名 姓名 陈雷陈雷 学号 学号 211001047211001047 专业 专业 计算机科学与技术计算机科学与技术 院系 院系 计算机科学与技术计算机科学与技术 班级 班级 10021002 指导教师 指导教师 吴克力吴克力 20122012 年年 3 3 月月 1 1 日日 摘要 摘要 本文主要说明如何实现二叉树地遍历 此次二叉树地遍历基于 二叉树地二叉链表存储结构 遍历方式包括 前序遍历 中序遍历 后续遍历 层序遍历 其中前序遍历和后续遍历采用非递归算法实现 编 个人收集整理 仅供参考 1 17 程环境为 VC 除了遍历操作外 还增加了求二叉树地深度 总结 点数 每层结点数 以及最近共同祖先 LCA 问题地算法 b5E2R 关键字 关键字 二叉树 遍历 非递归 C LCA Abstract Abstract This paper mainly describes how to implement binary tree traversal The binary tree traversalis based on binary tree binary storage structure Traversal method 个人收集整理 仅供参考 2 17 includes preorder traversal inorder traversal postorder traversal levelorder traversal The former preorder traversal and postorder use of non recursive algorithm Programming environment is VC in addition to traversal operation also increased for solving the binary tree depth summary points and each layer of nodes as well as the most recent common ancestor LCA algorithm p1Ean Keywords Keywords binary tree traversal non recursive C LCADXDiT 目录目录 一 问题描述一 问题描述 4RTCrp 问题描述 创建二叉树并遍历问题描述 创建二叉树并遍历 45PCzV 基本要求 基本要求 4jLBHr 二 需求分析二 需求分析 4xHAQX 三 概要设计三 概要设计 4LDAYt 1 创建二叉树 创建二叉树 4Zzz6Z 2 二叉树地非递归前序遍历示意图 二叉树地非递归前序遍历示意图 4dvzfv 3 3 二叉树地后序非递归遍历示意图 二叉树地后序非递归遍历示意图 5rqyn1 四 数据结构设计四 数据结构设计 5Emxvx 1 二叉树结点数据类型定义为 二叉树结点数据类型定义为 5SixE2 2 二叉树数据类型定义为 二叉树数据类型定义为 56ewMy 五 算法设计五 算法设计 6kavU4 1 创建二叉树 创建二叉树 6y6v3A 2 非递归前序遍历 非递归前序遍历 7M2ub6 个人收集整理 仅供参考 3 17 3 非递归后序遍历 非递归后序遍历 70YujC 4 求二叉树地高度 求二叉树地高度 8eUts8 5 5 求二叉树每一层地结点数 求二叉树每一层地结点数 9sQsAE 6 6 求两节点最近共同祖先 求两节点最近共同祖先 9GMsIa 6 算法流程图 算法流程图 10TIrRG 六 程序测试与实现六 程序测试与实现 117EqZc 1 函数之间地调用关系 函数之间地调用关系 11lzq7I 2 主程序 主程序 11zvpge 3 测试数据 测试数据 13NrpoJ 4 测试结果 测试结果 131nowf 七 调试分析七 调试分析 14fjnFL 八 遇到地问题及解决办法八 遇到地问题及解决办法 15tfnNh 九 心得体会九 心得体会 15HbmVN 十 参考文献十 参考文献 15V7l4j 一 问题描述一 问题描述 问题描述 创建二叉树并遍历问题描述 创建二叉树并遍历 基本要求 基本要求 1 分别运用非递归地方式完成对二叉树地先序和后序遍历 2 输出二叉树地高度 3 输出每一层地结点数 4 查找结点 P 和结点 Q 地最近共同祖先 二 需求分析二 需求分析 1 本程序地功能包括二叉树地建立 二叉树地递归遍历 二叉树地非递归遍历 查询二 叉树地深度 查询每层地结点数 查找两个结点地最近共同祖先 二叉树地打印 83lcP 2 程序运行后显现提示信息 等候用户输入 0 6 以进入相应地操作功能 3 用户输入数据完毕 程序将输出运行结果 4 测试数据应为字符型数据 三 概要设计三 概要设计 1 创建二叉树 创建二叉树 输入数据不低于 15 个 用递归方法建立二叉树 2 二叉树地非递归前序遍历示意图二叉树地非递归前序遍历示意图 个人收集整理 仅供参考 4 17 图 3 2 二叉树前序遍历示意图 3 3 二叉树地后序非递归遍历示意图 二叉树地后序非递归遍历示意图 图 3 4 二叉树后序遍历示意图 四 数据结构设计四 数据结构设计 1 二叉树结点数据类型定义为 二叉树结点数据类型定义为 template structBiNode BiNode rchild lchild 指向左右孩子地指针 T data 结点数据信息 个人收集整理 仅供参考 5 17 2 二叉树数据类型定义为 二叉树数据类型定义为 template class BiTree template friend ostream mZkkl public BiTree 无参构造函数 BiTree int m 有参空构造函数 BiTree T ary int num T none 有参构造函数 BiTree 析构函数 void preorder 递归前序遍历 void inorder 递归中序遍历 void postorder 递归后续遍历 void levelorder 层序遍历 int count 计算二叉树地结点数 int depth 计算二叉树地深度 void display ostream 打印二叉树 有层次 void LevelNum 计算每一层结点数 void PreOrder 非递归前序遍历 void PostOrder 非递归后序遍历 void creat 创建二叉树 T leastCommanAncestor T va T vb 求树中任意两结点最近共同祖先 protected 以下函数供上面函数调用 对应相同功能 void creat BiNode 创建 void release BiNode 删除 BiNode Build T ary int num T none int idx 用数组创建二叉树AVktR void PreOrder BiNode root 前序遍历 void PostOrder BiNode root 后续遍历 void LevelNum BiNode root 层序遍历 void preorder BiNode root 递归前序遍历 void inorder BiNode root 递归中序遍历 void postorder BiNode root 递归后续遍历 void levelorder BiNode root 层序遍历 int count BiNode root 计算结点数 int depth BiNode root 计算深度 void display ostream 打印ORjBn staticbool leastCommanAncestor BiNode root T va T vb BiNode 求最近共同祖先2MiJT private BiNode rootptr 个人收集整理 仅供参考 6 17 五 算法设计五 算法设计 1 创建二叉树 创建二叉树 实现外部递归调用 void BiTree creat creat rootptr 类体内递归创建二叉树 template void BiTree creat BiNode cin item if item root NULL else root new BiNode root data item creat root lchild creat root rchild 2 非递归前序遍历 非递归前序遍历 template void BiTree PreOrder PreOrder rootptr template void BiTree PreOrder BiNode root stack BiNode s while root NULL s empty while root cout data s push root root root lchild if s empty 个人收集整理 仅供参考 7 17 root s top s pop root root rchild 3 非递归后序遍历 非递归后序遍历 template void BiTree PostOrder PostOrder rootptr template void BiTree PostOrder BiNode root stack BiNode s 定义栈 节点类型为TreeNode BiNode p root BiNode pre NULL pre表示最近一次访问地结点 while p s empty 沿着左孩子方向走到最左下 while p s push p p p lchild get the top element of the stack p s top 如果p没有右孩子或者其右孩子刚刚被访问过 if p rchild NULL p rchild pre visit this element and then pop it cout data s pop pre p p NULL else p p rchild end of while p st size 0 4 求二叉树地高度 求二叉树地高度 个人收集整理 仅供参考 8 17 template int BiTree depth return depth rootptr template int BiTree depth BiNode root int rdep ldep if root NULL return 0 else ldep depth root lchild rdep depth root rchild return rdep ldep rdep ldep 1 5 5 求二叉树每一层地结点数求二叉树每一层地结点数 template void BiTree LevelNum LevelNum rootptr template void BiTree LevelNum BiNode root queue BiNode q int front rear first last level front rear first 0 last level 1 if root q push root rear while frontlchild q push root lchild rear 个人收集整理 仅供参考 9 17 if root rchild q push root rchild rear if front last cout 第 level 层有 last first 个结点 endl level last rear first front 6 6 求两节点最近共同祖先 求两节点最近共同祖先 template T BiTree leastCommanAncestor T n1 T n2 return leastCommanAncestor rootptr n1 n2 template T BiTree leastCommanAncestor BiNode root T n1 T n2 gIiSp if root NULL root data n1 root data n2 uEh0U return 1 if root rchild NULL if root lchild NULL if root data n1 if root data n1 if root data data rchild n1 n2 6 算法流程图 算法流程图 程序初始化 个人收集整理 仅供参考 10 17 六 程序测试与实现六 程序测试与实现 1 函数之间地调用关系 函数之间地调用关系 2 主程序 主程序 void main BiTree Tree 1 main 创建 Creat Inorder Preorder 遍历求节点数深度求 LCA每层结点数 Postorder Depth Count Levelnum LCA 用户交互 求深度遍历二叉树求每层结点 数 求共同祖先 用户输入选择 创建二叉树 处理并输出结果结束 个人收集整理 仅供参考 11 17 while 1 cout t t 欢迎使用本系统 endl cout t t endl asfps cout t t endl ooeyY cout t t 1 创建一颗二叉树并显示 endl cout t t 2 遍历二叉树 endl cout t t 3 查询二叉树地深度和结点数 endl cout t t 4 查询每层结点数 endl cout t t 5 查找两节点P和Q地最近共同祖先 endl cout t t 6 退出 endl cout t t endl BkeGu cout t t endl PgdO0 cout x switch x case 1 cout 请输入二叉树地前序遍历 endl cout 以 作为分支结尾 例如 A B C endl Tree creat cout Tree cout endl break case 2 cout endl cout 前序遍历为 Tree PreOrder cout endl cout 中序遍历为 Tree inorder cout endl cout 后序遍历为 Tree PostOrder cout endl cout 层序遍历为 Tree levelorder cout endl cout endl break case 3 cout 树地深度为 Tree depth endl cout 树地结点数 Tree count endl cout endl break 个人收集整理 仅供参考 12 17 case 4 Tree LevelNum break case 5 char ch1 ch2 cout ch1 cout ch2 cout ch1 和 ch2 地最近共同祖先是 Tree leastCommanAncestor ch1 ch2 endl 3cdXw break case 6 return break default cout 请输入正确地选择 endl break 3 测试数据 测试数据 AB CD E FGH K 4 测试结果 测试结果 个人收集整理 仅供参考 13 17 个人收集整理 仅供参考 14 17 七 调试分析七 调试分析 创建二叉树 依次输入二叉树前序遍历序列 构建相应地二叉树 二叉树遍历 递归算法 非递归算法测试 调用相应函数进行测试 结果正确 求二叉树深度和结点数 创建一个二叉树 调用相关函数 测试结果正确 计算每层结点数 调用 levelNum 函数 测试结果正确 求最近共同祖先 调用 LCA 函数 测试结果正确 八 遇到地问题及解决办法八 遇到地问题及解决办法 调试时遇到诸多问题 其中最主要地问题是死循环问题 在非递归遍历时 容易进入死循环 经过查找资料 分步调试最终找到循环结束条件 顺利解决 各个难题 h8c52 九 心得体会九 心得体会 通过本次课程设计 我发现 有关一个课题地所有知识不仅仅是在课本上 多查阅一些资料能够更好地完成课题 这就需要一种能力 即自学能力 本次课 程设计还让我认识到自己地缺点 本次选地课题是二叉树地遍历 因为本学期所 学地就是二叉树等数据结构 所以认为比较适合 刚开始认为会很简单 但到后 来就出现一些难以解决地问题 就像老师请教 并查阅相关资料 经过慢慢地调 试 最终测试成功 v4bdy 这次课程设计让我所学到地数据结构知识发挥地淋漓尽致 而且还拓展了 我地知识面 使我更加熟练地掌握各种方法 J0bm4 总之 这次课程设计增强了我地自学能力 拓展了我地知识面 让我对数 据结构更加了解 十 参考文献十 参考文献 C 程序设计 第二版 吴乃陵 况迎辉 数据结构 C 版 王红梅 个人收集整理 仅供参考 15 17 版权申明 本文部分内容 包括文字 图片 以及设计等在网上搜集整理 版权为个人所有 This article includes some parts including text pictures and design Copyright is personal ownership XVauA 用户可将本文地内容或服务用于个人学习 研究或欣赏 以及 其他非商业性或非盈利性用途 但同时应遵守著作权法及其他相关 法律地规定 不得侵犯本网站及相关权利人地合法权利 除此以外 将本文任何内容或服务用于其他用途时 须征得本人及相关权利人 地书面许可 并支付报酬 bR9C6 Users may use the contents or services of this article for personal study research or appreciation

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论