数据结构课程设计报告_遍历二叉树

  • 格式:pdf
  • 大小:324.09 KB
  • 文档页数:13

数据结构课程设计报告_遍历⼆叉树

XXXX⼤学

《数据结构》课程设计

报告

课题名称: 遍历⼆叉树

系(院):

专业:

班级:

组员姓名:

学号:

指导教师:

开课时间: 学年学期

摘要

树结构在客观世界中⼴泛存在, 如⼈类社会的族谱和各种社会组织机构都可⽤树形象表⽰. 树在计算机领域中也得到⼴泛应⽤,如在编译源程序时, 可⽤树表⽰源程序的语法结构. ⼜如在数据库系统中, 树型结构也是信息的重要组织形式之⼀. ⼀切具有层次关系的问题都可⽤树来描述.

针对这样的问题, 我选择了⼆叉树的遍历作为我的课程设计主题, 编写程序, 实现对⼆叉树的遍历. 在本次课程设计中, ⼆叉树的建⽴使⽤了递归算法;在前序、中序和后续遍历的算法中则同时使⽤了递归与⾮递归的算法, 即在这些遍历算法的实现中使⽤了栈结构与队列结构, 提供了6种不同的遍历⽅式, 供使⽤者选择. 同时, 该程序具有输出层序遍历的功能, 层序遍历模块使⽤了⾮递归算法. 该程序基本实现了对⼆叉树的遍历, 对于递归与⾮递归算法, 我们应从实际应⽤中体验这些算法的优越性.

关键词: 层次关系, ⼆叉树建⽴, 递归与⾮递归, 遍历, 栈, 队列

⽬录

⼀、问题描述 (1)

⼆、需求分析 (1)2.1主功能模块 (1)

2.2创建树模块 (1)

2.3遍历树模块 (1)

三、概要设计 (2)3.1主界⾯设计思想流程图 (2)

3.2. 创建⼆叉树 (2)

3.2.1⼆叉树创建的思想 (2)

3.2.2⼆叉树创建的算法流程图 (2)

3.3.先序递归遍历 (3)

3.3.1先序递归遍历思想 (3)

3.3.2先序递归遍历的算法流程图 (3)

3.4.中序递归遍历 (3)

3.4.1中序递归遍历思想 (3)3.4.2中序递归遍历的算法流程图 (4)

3.5.后序递归遍历 (4)

3.5.1后序递归遍历思想 (4)

3.5.2后序递归遍历的算法流程图 (5)

3.6.先序⾮递归遍历 (5)

3.6.1先序⾮递归遍历思想 (5)

3.6.2先序⾮递归遍历的算法流程图 (6)

3.7.中序⾮递归遍历 (6)

3.7.1中序⾮递归遍历思想 (6)

3.7.2中序⾮递归遍历的算法流程图 (7)

3.8.后序⾮递归遍历 (7)

3.8.1后序⾮递归遍历思想 (7)

3.8.2后序⾮递归遍历的算法流程图 (8)

3.9.层序⾮递归遍历 (8)

3.9.1层序⾮递归遍历思想 (8)

3.9.2层序⾮递归遍历的算法流程图 (9)

四、详细设计 (10)4.1界⾯设计 (10)

4.2.详细代码分析 (11)

4.2.1主模块 (11)

4.2.2创建树模块 (12)

4.2.3遍历树模块 (13)

五、调试分析 (13)5.1.调试结果 (13)

5.1.1实验数据 (13)

5.1.2创建树界⾯ (14)

5.1.3输出结果界⾯ (14)

5.2.算法分析 (16)

5.2.1时间复杂度 (16)

5.2.2空间复杂度 (16)

5.3.程序的不⾜ (16)

5.3.1程序不⾜之处 (16)

六、⼼得体会 (17)

七、参考⽂献 (17)

⼀、问题描述建⽴⼆叉树, 层序、先序、中序、后序遍历.(⽤递归或⾮递归的⽅法都可以)

要求能够输⼊树的各个结点, 并能够输出⽤不同⽅法遍历的遍历序列;分别建⽴⼆叉树存储结构的的输⼊函数、输出层序遍历序列的函数、输出先序遍历序列的函数、输出中序遍历序列的函数、输出后序遍历序列的函数.

⼆、需求分析

在现实世界层次化的数据模型中, 数据与数据之间的关系纷繁复杂. 其中很多关系⽆法使⽤简单的线性结构表⽰清楚, ⽐如祖先与后代的关系、整体与部分的关系等. 于是⼈们借鉴⾃然界中树的形象创造了⼀种强⼤的⾮线性结构——树. 树形结构的具体形式有很多种, 其中最常⽤的就是⼆叉树. ⽽⼆叉树的多层次遍历遍历则是⼆叉树的重要内容.

本程序⽤Microsoft Visual C++ 6.0编写, 可以实现对⼆叉树的创建、采⽤递归和⾮递归等两种⽅式先序、中序、后序进⾏遍历.2.1主功能模块

通过合理的界⾯设计, 根据提⽰信息, 使⽤者可以⽅便快捷地运⾏本程序来完成创建、遍历⼆叉树等操作. 界⾯美观, ⼈性化, 程序智能, 安全性⾼.2.2创建树模块

当进⼊程序运⾏界⾯后, 根据提⽰输⼊需要建⽴的⼆叉树, 按照先序次序输⼊各个结点的值, 完成⼆叉树的建⽴.2.3遍历树模块

实现对该⼆叉树的先序递归遍历、先序⾮递归遍历、中序递归遍历、中序⾮递归遍历、后序递归遍历、后序⾮递归遍历、层序⾮递归遍历等⽅式的遍历操作, 并输出各遍历序列.

三、概要设计3.1主界⾯设计思想流程图

3.2. 创建⼆叉树

3.2.1⼆叉树创建的思想

(1)定义⼆叉树结点值的类型为字符型.

(2)结点个数不超过10个.

(3)按先序次序输⼊, 构造⼆叉链表表⽰的⼆叉树T, 空格表⽰空树. 相关函数如下:

void CreateBiTree(BiTree &T)

3.2.2⼆叉树创建的算法流程图

3.3.先序递归遍历

3.3.1先序递归遍历思想

若⼆叉树为空, 则空操作;否则(1)访问根结点;

(2)先序遍历左⼦树;

(3)先序遍历右⼦树. 相关函数如下:

void PreOrderTraverse(BiTree T)

3.3.2先序递归遍历的算法流程图

3.4.中序递归遍历

3.4.1中序递归遍历思想

若⼆叉树为空, 则空操作;否则(1)中序遍历左⼦树;

(2)访问根结点;

(3)中序遍历右⼦树. 相关函数如下:

void InOrderTraverse(BiTree T)

3.4.2中序递归遍历的算法流程图

3.5.后序递归遍历

3.5.1后序递归遍历思想

若⼆叉树为空, 则空操作;否则(1)后序遍历左⼦树;

(2)后序遍历右⼦树;

(3)访问根结点. 相关函数如下:void PostOrderTraverse(BiTree T)3.6.先序⾮递归遍历

3.6.1先序⾮递归遍历思想

(1)访问结点的数据域;

(2)指针指向p的左孩⼦结点;

(3)从栈中弹出栈顶元素;

(4)指针指向p的右孩⼦结点. 相关函数如下:void NRPreOrder(BiTree bt)

3.7.中序⾮递归遍历

3.7.1中序⾮递归遍历思想

(1)指针指向p的左孩⼦结点;

(2)从栈中弹出栈顶元素;

(3)访问结点的数据域;

(4)指针指向p的右孩⼦结点. 相关函数如下:

void NRInOrder(BiTree bt)

3.7.2中序⾮递归遍历的算法流程图

3.8.后序⾮递归遍历

3.8.1后序⾮递归遍历思想

若⼆叉树为空, 则空操作;否则引⼊栈和标记模拟递归⼯作栈, 初始时栈为空. 相关函

数如下: void NRPostOrder(BiTree bt);3.8.2后序⾮递归遍历的算法流程图

3.9.层序⾮递归遍历

3.9.1层序⾮递归遍历思想

(1)访问该元素所指结点.

(2)若该元素所指结点的左右孩⼦结点⾮空, 则该元素所指结点的左孩⼦指针和右孩⼦指针顺序⼊队. 相关函数如下:

void LevelOrderTraverse(BiTree T)

3.9.2层序⾮递归遍历的算法流程图

四、详细设计4.1界⾯设计图4-1 系统运⾏主界⾯

图4-2 创建⼆叉树界⾯

图4-3 ⼆叉树递归遍历界⾯4.2.详细代码分析

4.2.1主模块

本模块定义了系统运⾏主界⾯的相关内容和相关操作函数, 源代码如下:void main(){

BiTree T;

T=NULL;

int select;//cout<<"请按先序次序输⼊各结点的值, 以空格表⽰空树(输⼊时可连续输⼊):"<

while(1){

cout<<"\n\n请选择要执⾏的操作:\n";

cout<<"1.创建⼆叉树\n";

cout<<"2.⼆叉树的递归遍历算法(前、中、后)\n";

cout<<"3.⼆叉树的层次遍历算法\n";

cout<<"4.⼆叉树的⾮递归遍历算法(前、中、后)\n";

cout<<"0.退出\n";

cin>>select;

switch(select){

case 0:return;

case 1:

cout<<"请按先序次序输⼊各结点的值, 以空格表⽰空树(输⼊时可连续输⼊):"<

CreateBiTree(T);

break;

case 2:

if(!T) cout<<"未建⽴树, 请先建树!";

else{

cout<<"\n先序遍历:\n";

PreOrderTraverse(T);

cout<<"\n中序遍历:\n";

InOrderTraverse(T);

cout<<"\n后序遍历:\n";

PostOrderTraverse(T);

}

break;

case 3:

cout<<"\n层序遍历:\n";

LevelOrderTraverse(T);

break;

case 4:

if(!T) cout<<"未建⽴树, 请先建树!";

else{

cout<<"\n先序遍历:\n";

NRPreOrder(T);cout<<"\n中序遍历:\n";

NRInOrder(T);

cout<<"\n后序遍历:\n";

NRPostOrder(T);

}

break;

default:

cout<<"请确认选择项:\n";

}//end switch

}//end while

}

4.2.2创建树模块

源代码如下:void CreateBiTree(BiTree &T){//按先序次序输⼊, 构造⼆叉链表表⽰的⼆叉树T, 空格表⽰空树

// if(T) return;

char ch;

ch=getchar(); //不能⽤cin来输⼊, 在cin中不能识别空格.

if(ch==' ') T=NULL;

else{

if(!(T=(BTNode *)malloc(sizeof(BTNode)))) cout<<"malloc fail!";

T->data=ch;

CreateBiTree(T->lchild);

CreateBiTree(T->rchild);

}

}

4.2.3遍历树模块

本模块包括了各种遍历⼆叉树的函数, 源代码如下:void PreOrderTraverse(BiTree T) //⼆叉树的先序遍历(递归)成员函数声明

void InOrderTraverse(BiTree T) //⼆叉树的中序遍历(递归)成员函数声明

void PostOrderTraverse(BiTree T) //⼆叉树的后序遍历(递归)成员函数声明

void LevelOrderTraverse(BiTree T) // ⼆叉树的层序遍历(⾮递归)成员函数声明

void NRPreOrder(BiTree bt) // ⼆叉树的先序遍历(⾮递归)成员函数声明

void NRInOrder(BiTree bt) //⼆叉树的中序遍历(⾮递归)成员函数声明

void NRPostOrder(BiTree bt) //⼆叉树的后序遍历(⾮递归)成员函数声明

五、调试分析