- 1、本文档共24页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构 课程设计说明书
题目: 二叉树的遍历
学生姓名:
学 号:
院 (系):
专 业:
指导教师:
目 录
TOC \o "1-3" \h \u 1 选题背景 1
2 概念设计 1
2. 1 问题提出 1
2.2 遍历方法 2
2.3 算法框架 2
3 详细设计 2
4 调试分析 7
4.1 结果显示 7
4.2 算法分析 10
5 总结 10
参考文献
附录
1 选题背景
数据结构是计算机、信息管理、信息与计算机科学等信息类专业最重要的专业基础课程,掌握好数据结构的知识将直接关系到后续专业课程的学习。数据结构只要研究四个方面的问题:
(1)数据的逻辑结构,即数据之间的逻辑关系;
(2)数据的物理结构,即数据在计算机内的存储方式;
(3)对数据的加工,即基于某种存储方式的操作算法;
(4)算法的分析;即评价算法的优劣。
本实验是用链式存储结构来存储二叉树并进行一系列的算法,且结点内容的数据类型为字符型。
本程序用VC++6.0编写,可以实现各种二叉树的遍历[1]。包括先序遍历、中序遍历、后序遍历的递归算法,先序遍历、中序遍历、后序遍历的非递归算法以及能查找任一结点在某种遍历序列中的前驱和后继。根据题目知,程序主要是根据给定二叉树的先序遍历结果,构造出二叉树并输出按中,后序遍历的结果,
(1)先创建二叉树:按先序次序输入,构造二叉链表表示的二叉树。
(2)设计算法:先序遍历,中序遍历,后序遍历.在做到层序遍历时,应注意算法如下:根结点入队,队头元素出队,左孩子不为空入队右孩子不为空入队的顺序进行。
(3)设计main()函数调用以上步骤实现相关功能。
2 概念设计
1.1 问题提出
二叉树的遍历[2]本质上其实就是入栈出栈的问题,递归算法简单且容易理解,但是效率始终是个问题。非递归算法可以清楚的知道每步实现的细节,但是乍一看不想递归算法那么好理解,各有各的好处吧。接下来根据下图进行二叉树的遍历实现。
图1-1,基本二叉树
1.2 遍历方法
(1)先序遍历:先序遍历是先输出根节点,再输出左子树,最后输出右子树。
(2)中序遍历:中序遍历是先输出左子树,再输出根节点,最后输出右子树。
(3)后序遍历:后序遍历是先输出左子树,再输出右子树,最后输出根节点。
1.3 算法框架
如下图所示:
图2-1,二叉树遍历算法框架
3 过程设计
(1)创建树[3],以先序序列建立树
void CreateTree(Tree&t)
{
char ch;
scanf("%c",&ch);
if ( ch == '#' )
t = NULL;
else
{
t = (Tree)malloc(sizeof(TreeNode));
if ( !t )
{
printf("分配内存出错!");
return ;
}
t->data = ch;
CreateTree(t->lchild);
CreateTree(t->rchild);
}
}
(2)递归先序遍历
void PreOrder(Tree t)
{
if ( t )
{
printf("%c",t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
(3) 非递归先序遍历
void PreOrder1(Tree t)
{
Tree p = t;
Sqstack s;
InitStack(s);
while ( p || !StackEmpty(s) )
{
if ( p )
{
printf("%c",p->data);
Push(s,p);
p = p->lchild;
}
else
{
Pop(s,p);
p = p->rchild;
}
}
}
(4) 递归中序遍历
void
文档评论(0)