数据结构课程设计--按层次遍历二叉树

合集下载

二叉树的遍历和应用

二叉树的遍历和应用

内蒙古科技大学本科生课程设计说明书题目:数据结构课程设计——二叉树的遍历和应用学生姓名:学号:专业:班级:指导教师:2013年5月29日内蒙古科技大学课程设计说明书内蒙古科技大学课程设计任务书I内蒙古科技大学课程设计说明书目录内蒙古科技大学课程设计任务书..............................................................错误!未定义书签。

目录 (II)第一章需求分析 (3)1.1课程设计目的 (3)1.2任务概述 (3)1.3课程设计内容 (3)第二章概要设计 (5)2.1设计思想 (5)2.2二叉树的遍历 (5)2.3运行界面设计 (6)第三章详细设计 (7)3.1二叉树的生成 (7)3.2二叉树的先序遍历 (7)3.3 二叉树的中序遍历 (8)3.4二叉树的后续遍历 (8)3.5主程序的设计 (8)第四章测试分析 (11)4.1二叉树的建立 (11)4.2二叉树的先序、中序、后序遍历 (11)第五章课程设计总结 (12)附录:程序代码 (13)致谢 ···········································································································错误!未定义书签。

二叉树和二叉树的遍历教案打印

二叉树和二叉树的遍历教案打印

遍历二叉树课程教案
深度为k ,且有2k -1个结点的二叉树。

二、遍历二叉树
遍历二叉树:指按一定的规律对二叉树的每个结点,访问且仅访问
一次的处理过程。

遍历对线性结构是容易解决的。

而二叉树是非线性的,因而需要寻
找一种规律,使二叉树上的结点能排列在一个线性队列上,从而便于遍
历。

遍历的次序:假如以L 、D 、R 分别表示遍历左子树、遍历根结点和
遍历右子树,规定先左后右,则只有前三种情况,分别规定为:
DLR ——先(根)序遍历,
LDR ——中(根)序遍历,
LRD ——后(根)序遍历。

例题:
图-3 图-4
图-2 满二叉树
1
2 3 4 5 6 7 深 度:K=3 节点数:n=23-1
叶子数:N=23-1。

二叉树的遍历教案

二叉树的遍历教案

课题二叉树的遍历学习目标:1、知识与技能掌握二叉树三种遍历的遍历原则和方法2、过程与方法通过体验、分析、讲授和实践探究,学会遍历二叉树3情感态度与价值观(!)通过遍历学习,培养学生细致严谨的思维习惯(2)促进学生对算法学习的热情,学习在平时生活中建模思想。

学情分析:本学期高一学生刚刚学习完数学选修科目3《算法》,对数据流程有比较深刻的认知,具备探究树理论的基础。

重难点:重点:二叉树特征;难点:二叉树的遍历规则的实际使用。

教学过程:活动一:一起游戏——汉诺塔游戏介绍:汉诺塔是一款WP7平台上源于印度一个古老传说的益智类游戏。

传说上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

游戏玩法:游戏里有三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。

玩家需要做的是把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

活动二:二叉树1 特点:一棵由一个结点和两棵互不相交的分别称作根的左子树和右子树所组成的非空树,左右子树又同样都是二叉树。

遍历是对二叉树树的一种最基本的运算,就是按一定的规则和顺序走遍二叉树的所有结点,使每一个结点都被访问一次,而且只被访问一次。

2 几种遍历(1)前序遍历:中序遍历后序遍历(2)遍历规则步骤第一第二第三名称前序遍历访问根结点前序遍历左子树前序遍历右子树中序遍历中序遍历左子树访问根结点中序遍历右子树后序遍历后序遍历左子树后序遍历右子树风味根结点备注二叉树非空活动三:完成图5二叉树的前序遍历abcdeghi图5活动四:分组讨论完成右图二叉树的中序遍历和后序遍历中序CBDAEGF后序:CDBGFEA活动五:讨论探究完成图5二叉树的中序遍历和后序遍历中序:CBAFEGDHI后序:CBFGEIHDA活动五:知识拓展:1假设前序遍历是adbgcefh,中序遍历是dgbaechf,请你推演出该二叉树;2假设后序遍历是gbdehfca,中序遍历是dgbaechf,请你推演出该二叉树的前序遍历节奏把控:前序遍历是先访问根节点,然后再访问子树的,而中序遍历则先访问左子树再访问根节点,那么把前序的a 取出来,然后查找a 在中序遍历中的位置就得到dgb a echf 这样我们就知道dgb 是左子树echf 是右子树,因为数量要吻合所以前序中相应的dbg 是左子树cefh 是右子树。

二叉树遍历-教学设计

二叉树遍历-教学设计

二叉树遍历--教学设计所属学科:数据库专业:计算机(相关学科)课程:数据结构适用对象:大二上学期本课所讲解的内容为二叉树遍历的三种基本方法和一种新颖的方法,所属学科为数据结构与算法。

数据结构与算法是计算机专业的重要基础课,也是非计算机专业学生在大学生计算机等级考试中的课程之一,是一门集技术性、理论性和实践性于一体的课程。

故本微课结合该课程特点,合理分配知识结构及节奏,并融充分合多媒体技术,算法描述清晰,展现内容丰富,适合课堂教学,也便于自学,可作为高等院校计算机专业和其他相关专业的参考资料,也可供参加全国普通高校非计算机专业大学生计算机等级考试(CCT)的学生及计算机爱好者学习和参考。

教学思想:本课内容没有太过繁琐的语言,而是采用与多媒体充分融合的方式,并采用部分flash动画讲解遍历方法,生动、简洁、丰富地展现教学内容,教学思路清晰。

提高了教学效率和教学质量,使学生在单位时间内能够学到更多的知识,更大幅度地提高学生各方面的能力,从而使学生获得良好的发展。

课程设计思路:遍历是二叉树上最重要的运算之一,是二叉树上进行其它运算之基础。

由于访问结点所做的操作依赖于具体的应用问题,所以我们对所讲解的问题分别举了一个容易和较难的例子,并配上一个难度适中的启发式的习题思考,在讲解过程中让学生充分理解,并学会运用不同的遍历方式解决问题,最后加上顺口溜式的总结,使学生对知识点更加融会贯通。

教学特色:1、教学思路清晰。

对于遍历的讲解是按照遍历概念、实例、动画演示、算法和总结的步骤进行的,效果较好。

2、在视频讲解中,语言生动而富于亲和力,表达多样,激发学生兴趣。

通过改变教学内容的展现形式,更具独到趣味,激发学生内外动力来实现。

3、在课件中,我们的幻灯片布局简洁,动画紧随讲解节奏的推进而随时跟进,生动形象,而又清晰明了地将所讲的知识点呈现出来,充分运用了现代多媒体教学方式的优点。

4、在PPT中我们插入了Flash动画,让遍历方法更加清晰明了,让学习者更容易理解与掌握。

数据结构-二叉树的存储结构和遍历

数据结构-二叉树的存储结构和遍历

return(p); }
建立二叉树
以字符串的形式“根左子树右子树”定义 一棵二叉树
1)空树 2)只含一个根 结点的二叉树 A 3)
B C
A
以空白字符“ ”表示
以字符串“A ”表示
D
以下列字符串表示 AB C D
建立二叉树 A B C C
T
A ^ B ^ C^ ^ D^
D
建立二叉树
Status CreateBiTree(BiTree &T) {
1 if (!T) return;
2 Inorder(T->lchild, visit); // 遍历左子树 3 visit(T->data); } // 访问结点 4 Inorder(T->rchild, visit); // 遍历右子树
后序(根)遍历
若二叉树为空树,则空操

左 子树
右 子树
作;否则, (1)后序遍历左子树; (2)后序遍历右子树; (3)访问根结点。
统计二叉树中结点的个数
遍历访问了每个结点一次且仅一次
设置一个全局变量count=0
将visit改为:count++
统计二叉树中结点的个数
void PreOrder (BiTree T){ if (! T ) return; count++; Preorder( T->lchild); Preorder( T->rchild); } void Preorder (BiTree T,void( *visit)(TElemType& e)) { // 先序遍历二叉树 1 if (!T) return; 2 visit(T->data); // 访问结点 3 Preorder(T->lchild, visit); // 遍历左子树 4 Preorder(T->rchild, visit);// 遍历右子树 }

数据结构入门-树的遍历以及二叉树的创建

数据结构入门-树的遍历以及二叉树的创建

数据结构⼊门-树的遍历以及⼆叉树的创建树定义:1. 有且只有⼀个称为根的节点2. 有若⼲个互不相交的⼦树,这些⼦树本⾝也是⼀个树通俗的讲:1. 树是有结点和边组成,2. 每个结点只有⼀个⽗结点,但可以有多个⼦节点3. 但有⼀个节点例外,该节点没有⽗结点,称为根节点⼀、专业术语结点、⽗结点、⼦结点、根结点深度:从根节点到最底层结点的层数称为深度,根节点第⼀层叶⼦结点:没有⼦结点的结点⾮终端节点:实际上是⾮叶⼦结点度:⼦结点的个数成为度⼆、树的分类⼀般树:任意⼀个结点的⼦结点的个数都不受限制⼆叉树:任意⼀个结点的⼦结点个数最多是两个,且⼦结点的位置不可更改⼆叉数分类:1. ⼀般⼆叉数2. 满⼆叉树:在不增加树层数的前提下,⽆法再多添加⼀个结点的⼆叉树3. 完全⼆叉树:如果只是删除了满⼆叉树最底层最右边的连续若⼲个结点,这样形成的⼆叉树就是完全⼆叉树森林:n个互不相交的树的集合三、树的存储⼆叉树存储连续存储(完全⼆叉树)优点:查找某个结点的⽗结点和⼦结点(也包括判断有没有⼦结点)速度很快缺点:耗⽤内存空间过⼤链式存储⼀般树存储1. 双亲表⽰法:求⽗结点⽅便2. 孩⼦表⽰法:求⼦结点⽅便3. 双亲孩⼦表⽰法:求⽗结点和⼦结点都很⽅便4. ⼆叉树表⽰法:把⼀个⼀般树转化成⼀个⼆叉树来存储,具体转换⽅法:设法保证任意⼀个结点的左指针域指向它的第⼀个孩⼦,右指针域指向它的兄弟,只要能满⾜此条件,就可以把⼀个⼀般树转化为⼆叉树⼀个普通树转换成的⼆叉树⼀定没有右⼦树森林的存储先把森林转化为⼆叉树,再存储⼆叉树四、树的遍历先序遍历:根左右先访问根结点,再先序访问左⼦树,再先序访问右⼦树中序遍历:左根右中序遍历左⼦树,再访问根结点,再中序遍历右⼦树后续遍历:左右根后续遍历左⼦树,后续遍历右⼦树,再访问根节点五、已知两种遍历求原始⼆叉树给定了⼆叉树的任何⼀种遍历序列,都⽆法唯⼀确定相应的⼆叉树,但是如果知道了⼆叉树的中序遍历序列和任意的另⼀种遍历序列,就可以唯⼀地确定⼆叉树已知先序和中序求后序先序:ABCDEFGH中序:BDCEAFHG求后序:这个⾃⼰画个图体会⼀下就可以了,⾮常简单,这⾥简单记录⼀下1. ⾸先根据先序确定根,上⾯的A就是根2. 中序确定左右,A左边就是左树(BDCE),A右边就是右树(FHG)3. 再根据先序,A左下⾯就是B,然后根据中序,B左边没有,右边是DCE4. 再根据先序,B右下是C,根据中序,c左下边是D,右下边是E,所以整个左树就确定了5. 右树,根据先序,A右下是F,然后根据中序,F的左下没有,右下是HG,6. 根据先序,F右下为G,然后根据中序,H在G的左边,所以G的左下边是H再来⼀个例⼦,和上⾯的思路是⼀样的,这⾥就不详细的写了先序:ABDGHCEFI中序:GDHBAECIF已知中序和后序求先序中序:BDCEAFHG后序:DECBHGFA这个和上⾯的思路是⼀样的,只不过是反过来找,后序找根,中序找左右树简单应⽤树是数据库中数据组织⼀种重要形式操作系统⼦⽗进程的关系本⾝就是⼀棵树⾯向对象语⾔中类的继承关系哈夫曼树六、⼆叉树的创建#include <stdio.h>#include <stdlib.h>typedef struct Node{char data;struct Node * lchild;struct Node * rchild;}BTNode;/*⼆叉树建⽴*/void BuildBT(BTNode ** tree){char ch;scanf("%c" , &ch); // 输⼊数据if(ch == '#') // 如果这个节点的数据是#说明这个结点为空*tree = NULL;else{*tree = (BTNode*)malloc(sizeof(BTNode));//申请⼀个结点的内存 (*tree)->data = ch; // 将数据写⼊到结点⾥⾯BuildBT(&(*tree)->lchild); // 递归建⽴左⼦树BuildBT(&(*tree)->rchild); // 递归建⽴右⼦树}}/*⼆叉树销毁*/void DestroyBT(BTNode *tree) // 传⼊根结点{if(tree != NULL){DestroyBT(tree->lchild);DestroyBT(tree->rchild);free(tree); // 释放内存空间}}/*⼆叉树的先序遍历*/void Preorder(BTNode * node){if(node == NULL)return;else{printf("%c ",node->data );Preorder(node->lchild);Preorder(node->rchild);}}/*⼆叉树的中序遍历*/void Inorder(BTNode * node){if(node == NULL)return;else{Inorder(node->lchild);printf("%c ",node->data );Inorder(node->rchild);}}/*⼆叉树的后序遍历*/void Postorder(BTNode * node){if(node == NULL)return;else{Postorder(node->lchild);Postorder(node->rchild);printf("%c ",node->data );}}/*⼆叉树的⾼度树的⾼度 = max(左⼦树⾼度,右⼦树⾼度) +1*/int getHeight(BTNode *node){int Height = 0;if (node == NULL)return 0;else{int L_height = getHeight(node->lchild);int R_height = getHeight(node->rchild);Height = L_height >= R_height ? L_height +1 : R_height +1; }return Height;}int main(int argc, char const *argv[]){BTNode * BTree; // 定义⼀个⼆叉树printf("请输⼊⼀颗⼆叉树先序序列以#表⽰空结点:");BuildBT(&BTree);printf("先序序列:");Preorder(BTree);printf("\n中序序列:");Inorder(BTree);printf("\n后序序列:");Postorder(BTree);printf("\n树的⾼度为:%d" , getHeight(BTree));return 0;}// ABC##DE##F##G##。

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


8
if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } } void postorder(bitree *bt)/*后序序遍历二叉树*/ { if(bt!=NULL) { postorder(bt->lchild); postorder(bt->rchild); printf("%c",bt->data); } }
3.2.2 二叉树的中序递归遍历算法
void inorder(bitree *bt)/*中序序遍历二叉树*/ { if(bt!=NULL)/*二叉树 bt 非空*/ { inorder(bt->lchild);/*中序遍历 bt 的左子树*/ printf("%c",bt->data);/*访问结点 bt*/ inorder(bt->rchild);/*中序遍历 bt 的右子树*/ } }
图 1 “菜单”界面
图2
创建二叉树
5
图 3 二叉树的先序遍历
图4
二叉树的中序输出
6
图 5 二叉树的后序输出
五:实验总结 虽然做的过程中出现很多错误。但是最后还是一一纠正了,并在其中发现了自 身的不足,补学补差。最后终于完成了。
六:源程序附录
#include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct node { datatype data;/*数据元素*/ struct node *lchild,*rchild;/*指向左,右孩子*/ }bitree; bitree *root;/*二叉树结点类型定义*/ bitree *creatbitree(bitree *root)/*创建二叉树*/ { char ch;

利用队列实现二叉树的层次遍历

实验三利用队列实现二叉树的层次遍历实验目的(1)掌握利用二叉树的递归结构性质建立二叉链表(2)掌握循环队列的基本算法(3)掌握二叉树的遍历算法实验环境(1)Windows 2000,或WindowsXP(简体中文)(2)Visual C++ 6.0,或C++ Builder 6.0操作系统环境和编程环境(集成开发环境)任选以上所列之一。

实验内容设计一个利用队列实现二叉树层次遍历的程序。

假设二叉树结点的元素数据类型为字符型,二叉树以二叉链表存储。

利用二叉树的递归结构性质,通过读取键盘输入的如图所示二叉树的先序序列,建立其二叉链表。

实现步骤:以C++ Builder环境为例,实现步骤如下:1.新建一个Win32 Console Application程序项目。

2.在代码编辑窗口编写程序代码,含义如注释说明:#include <iostream.h>#include <conio.h>#define maxlen 10 // 定义循环队列的数组大小typedefstruct node{ char data;struct node *lp, *rp;}bt_node; // 二叉链表结点类型typedefstruct qnode{ bt_node *data[maxlen];int front, rear;}queue; // 队列数据类型void init_queue(queue &q) // 初始化队列函数{ q.front=0;q.rear=0;}int empty_queue(const queue &q) // 判队空函数{ if(q.front==q.rear) return 1;return 0;}int into_queue(queue &q, bt_node *bp) // 入队函数{ if((q.rear+1)%maxlen==q.front) return 0;q.rear=(q.rear+1)%maxlen;q.data[q.rear]=bp;return 1;}bt_node *out_queue(queue &q) // 出队函数{// if(empty_queue(q)) return NULL;q.front=(q.front+1)%maxlen;return q.data[q.front];}bt_node *create_btree() // 建立二叉链表函数{/* 读取一个元素符号;若为空元素(以特殊字符表示), 则返回空地址;否则, 申请二叉链表新结点, 将元素符号写入该结点, 递归建立其左子树和右子树, 并返回该结点地址*/char c;c=cin.get();if(c=='_')return NULL;bt_node *p = new bt_node;p->data = c;p->lp = create_btree();p->rp = create_btree();return p;}void visit(char c) // 访问元素函数{ cout<<c<<' ';}void bt_travel_width_first(bt_node *bp) // 层次遍历二叉链表函数{/* 初始化队列;若bp非空则bp入队;当队列非空, 重复下列操作:{ 出队;访问出队指针所指结点的元素;若该结点左指针非空则入队;若该结点右指针非空则入队;}*/queue treequeue;init_queue(treequeue);if(empty_queue(treequeue))into_queue(treequeue, bp) ;while(!empty_queue(treequeue)){bt_node *p = new bt_node;p = out_queue(treequeue);cout << p->data << ' ';if(p>lp!=NULL)into_queue(treequeue, p->lp) ;if(p->rp!=NULL)into_queue(treequeue, p->rp) ;}}void main(){ bt_node *Bp; // 指向二叉树根结点的指针cout<<"Input a bitree node in root-first order: \n";Bp=create_btree();cout<<"the sequence of traveling in width-first order: "<<endl;bt_travel_width_first(Bp);cout<<endl;getch();}3.保存程序项目。

二叉树遍历讲课教案ppt课件

I; 中序遍历序列:D,C,B,E,H,A,G, I,F,试画出二叉树,并写出该二叉树的前序 遍历序列和中序遍历序列。
资金是运动的价值,资金的价值是随 时间变 化而变 化的, 是时间 的函数 ,随时 间的推 移而增 值,其 增值的 这部分 资金就 是原有 资金的 时间价 值
6.5 线索二叉树
§ 何谓线索二叉树? § 线索链表的遍历算法 § 如何建立线索链表?
一、问题的提出
顺着某一条搜索路径巡访二叉树 中的结点,使得每个结点均被访问一 次,而且仅被访问一次。
“访问”的含义可以很是随 时间变 化而变 化的, 是时间 的函数 ,随时 间的推 移而增 值,其 增值的 这部分 资金就 是原有 资金的 时间价 值
if (T) {
visit(T->data);
// 访问结点
Preorder(T->lchild, visit); // 遍历左子树
Preorder(T->rchild, visit);// 遍历右子树 }
}
资金是运动的价值,资金的价值是随 时间变 化而变 化的, 是时间 的函数 ,随时 间的推 移而增 值,其 增值的 这部分 资金就 是原有 资金的 时间价 值
资金是运动的价值,资金的价值是随 时间变 化而变 化的, 是时间 的函数 ,随时 间的推 移而增 值,其 增值的 这部分 资金就 是原有 资金的 时间价 值
二、先左后右的遍历算法
先(根)序的遍历算法 中(根)序的遍历算法 后(根)序的遍历算法
资金是运动的价值,资金的价值是随 时间变 化而变 化的, 是时间 的函数 ,随时 间的推 移而增 值,其 增值的 这部分 资金就 是原有 资金的 时间价 值
先(根)序的遍历算法:
若二叉树为空树,则空操作;否则, (1)访问根结点; (2)先序遍历左子树; (3)先序遍历右子树。

数据结构课程设计报告-最短路径算法-二叉树的三种遍历

数据结构课程设计报告班级:计算机科学与技术132班姓名:赖恒财指导教师:董跃华成绩:32信息工程学院2015 年7月8日目录图的最短路径算法实现1. 需求分析 (1)1.1 程序设计内容 (1)1.2 设计要求 (1)2.概要设计 (2)3.详细设计 (2)3.1 数据类型的定义 (2)3.2 功能模块的设计 (2)3.3 主程序流程 (9)4.调试分析 (10)4.1 问题回顾和分析 (10)4.2.经验和体会 (11)5.测试结果 (12)二叉树的遍历1.设计目的 (13)2.需求分析 (14)2.1课程设计的内容和要求 (14)2.2选题的意义及背景 (14)3.概要设计 (14)3.1设计思想 (14)3.2程序数据类型 (16)3.3程序模块分析 (16)3.3.1置空栈 (16)3.3.2入栈 (17)3.3.3出栈 (17)3.3.4取栈顶操作 (17)3.3.5判空栈 (17)3.4函数关系: (18)4.详细设计 (18)4.1二叉树算法程序截图和结果 (18)5.程序测试结果及问题分析 (19)6.总结 (20)参考文献 (21)附录1 (22)附录2 (26)图的最短路径算法实现----基于floyd最短路径算法1.需求分析设计校园平面图,所含景点不少于8个。

以图中顶点表示学校内各景点,存放景点的名称、景点介绍信息等;以边表示路径,存放路径长度信息。

要求将这些信息保存在文件graph.txt中,系统执行时所处理的数据要对此文件分别进行读写操作。

1.1程序设计内容1.从文件graph.txt中读取相应数据, 创建一个图,使用邻接矩阵表示图;2.景点信息查询:为来访客人提供校园任意景点相关信息的介绍;3.问路查询:为来访客人提供校园任意两个景点之间的一条最短路径。

1.2 设计要求(1) 程序要具在一定的健壮性,即当输入数据非法时,程序也能适当地做出反应。

(2) 程序要添加适当的注释,程序的书写要采用缩进格式。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计--按层次遍历二叉树学号:题目按层次遍历二叉树学院计算机科学与技术专业计算机科学与技术班级姓名指导教师2013年6月20日11问题描述及要求 (4)1.1问题描述 (4)1.2任务要求.................................. 4 2 开发平台及所使用软件.............................. 4 3 程序设计思路.. (5)3.1二叉树存储结构设计 (5)3.2题目算法设计 (5)3.2.1 建立二叉树 (5)3.2.2 遍历二叉树 (5)3.3.3 按要求格式输出已建立的二叉树 (6)3.3 测试程序................................ 6 4 调试报告.................................... 6 5 经验和体会.................................. 6 6源程序清单及运行结果 (7)6.1 源程序清单 (7)6.2 运行结果................................ 9 7 参考文献...................................10 本科生课程设计成绩评定表 (11)2课程设计任务书学生姓名:专业班级:计科ZY1102班指导教师:工作单位:计算机科学系题目: 按层次遍历二叉树初始条件:编写按层次顺序(同一层自左至右)遍历二叉树的算法。

(1)二叉树采用二叉链表作为存储结构。

⑵按严蔚敏《数据结构习题集(C语言版)》p44面题6.69所指定的格式输出建立的二叉树。

(3)输出层次遍历结果。

(4)自行设计测试用例。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容:1.问题描述简述题目要解决的问题是什么。

2. 设计存储结构设计、主要算法设计(用类C/C++语言或用框图描述)、测试用例设计;3. 调试报告调试过程中遇到的问题是如何解决的; 对设计和编码的讨论和分析。

4. 经验和体会(包括对算法改进的设想)5. 附源程序清单和运行结果。

源程序要加注释。

如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出。

说明:1. 设计报告、程序不得相互抄袭和拷贝; 若有雷同,则所有雷同者成绩均为0 分。

2. 凡拷贝往年任务书或课程设计充数者,成绩一律无效,以0 分记。

时间安排:1(第17周完成,验收时间由指导教师指定2(验收地点:实验中心3(验收内容:可执行程序与源代码、课程设计报告书。

指导教师签名:2013年6月14日系主任(或责任教师)签名:年月曰3数据结构课程设计--- 按层次遍历二叉树1问题描述及要求1.1问题描述编写按层次顺序(同一层自左至右)遍历二叉树的算法,并将二叉树按指定格式输出。

(题集p44面题6.69所指定的格式)指定格式如下:B图一: 指定输出格式1.2 任务要求编写按层次顺序(同一层自左至右) 遍历二叉树的算法。

(1) 二叉树采用二叉链表作为存储结构。

(2) 按题集p44面题6.69所指定的格式输出建立的二叉树(3) 输出层次遍历结果。

(4) 测试用例自己设计。

2 开发平台及所使用软件Windows 7.0 , Visual Studio201043 程序设计思路3.1 二叉树存储结构设计struct BinTreeNode // 二叉树用二叉链表存储{char data; // 二叉树结点值为字符型BinTreeNode* leftchild; // 左孩子指针BinTreeNode*rightchild; // 右孩子指针}3.2 题目算法设计3.2.1 建立二叉树void BinTree::creatBinTree(istream& in,BinTreeNode*&subTree) // 通过输入流in 建立二叉树{char item;cin.get(item);if(item!=' '){subTree=new BinTreeNode(item); creatBinTree(in,subTree->leftchild); creatBinTree(in,subTree->rightchild);}else{subTree=NULL;}};3.2.2 遍历二叉树void BinTree::levelOrder(BinTreeNode* subTree) // {queue<BinTreeNode *>q;BinTreeNode*p=subTree;q.push(p);while(!q.empty()) // 若树非空{p=q.front();cout<<visit(p)<<" "; // 输出队头元素q.pop(); if(p->leftchild!=NULL){q.push(p->leftchild);} //if(p->rightchild!=NULL){q.push(p->rightchild);}}};333按要求格式输出已建立的二叉树按层次序遍历二叉树左子树非空,入队void Prin t_Bi nTree(Bi nTreeNode* Tree,i nt i) // 按要求格式输出已建立的二叉树i表示结点所在层次。

初始i=0 {Bin TreeNode*p=Tree;if(p->rightchild) Prin t_Bi nTree(Tree->rightchild,i+1); // 递归函数for(int j=1;j<=i;j++) cout<<" "; // 打印i 个空格表示层次cout<<p->data<<e ndl;if(p->leftchild) Prin t_Bi nTree(Tree->leftchild,i+1);};图2: 测试二叉树如图所示二叉树,按先序遍历顺序输入,AB#D##CE#F###其中” #”代表空格,二叉树是:A为根节点,A左孩子是B,右孩子是C,B的左孩子为空,右孩子为D, C的左孩子为E,右孩子为空,E的左孩子为空,右孩子为F。

根据以下程序运行结果( 见图4) 可知,程序正确运行。

若输入AB#D#CE#F###则程序出现错误,不能运行。

(见图3)4 调试报告1、在建立二叉树时,输入的格式一定要正确,没有孩子的要用空格表示,在测试用例中,F没有孩子,要用两个空格表示,如果输入“ AB#D##CE#F则没有输出结果。

2、起初编写输出程序(void Print_BinTree(BinTreeNode* Tree,int i)) 的时候,始终显示编译无错误,但是不能运行,出现了一堆有关内存分配错误的问题。

最后发现没有将指针指向结点。

经改正,运行成功。

5 经验和体会本程序的建立和遍历二叉树的程序都比较简单,关键在于按要求打印二叉树。

起初一直6 找不到合适的方法按题目要求打印二叉树,在和同学讨论了很久之后终于有了思路。

在调试程序的时候也出现了问题,起初没有在意输入方式对程序运行结果的影响,导致程序无法运行,在检查了很久之后终于找到了问题的所在,对输入进行了改正,得到了正确的结果。

除此之外,编写C++程序的过程中,指针时钟是个难点也是个重点,今后要多练习,多理解才行。

6源程序清单及运行结果6.1 源程序清单#include<iostream> #include<queue> using namespace std;structBinTreeNode // 定义结构体{char data;BinTreeNode* leftchild;BinTreeNode*rightchild;BinTreeNode():leftchild(NULL),rightchild(NULL){}// 结构体可以有构造函数BinTreeNode(intx,BinTreeNode*l=NULL,BinTreeNode*r=NULL):data(x),leftchild(l),rightchild(r){}};class BinTree{private:BinTreeNode* root;public:BinTree():root(NULL){}; // 构造函数,构造一棵空的二叉树BinTreeNode*getroot(){return root;}BinTree(const BinTree&s); // 复制构造函数~BinTree(){destroy(root);} // 析构函数void destroy(BinTreeNode* subTree); // 删除void creatBinTree(istream&in,BinTreeNode* &subTree); //树friend istream& operator>>(istream& in,BinTree & Tree); //输入void levelOrder(BinTreeNode* subTree); // 层次序遍历char visit(BinTreeNode*p){return p->data;}; // 取值};istream& operator>>(istream& in,BinTree& Tree)// 重载操作: 输入并建立一棵二叉树。

in 是输入流对象{Tree.creatBinTree(in,Tree.root);return in;7};void BinTree::creatBinTree(istream& in,BinTreeNode*&subTree) // 从输入流in 输入二叉树表示建立对应的二叉链表{char item;cin.get(item);if(item!=' '){subTree=new BinTreeNode(item);creatBinTree(in,subTree->leftchild);creatBinTree(in,subTree->rightchild);}else 从文件读入建重载操作:subTree=NULL;}};void BinTree::levelOrder(BinTreeNode* subTree) { queue<BinTreeNode *>q; BinTreeNode*p=subTree; q.push(p); while(!q.empty()) // 队列不空{ p=q.front();cout<<visit(p)<<" "; q.pop();if(p->leftchild!=NULL){q.push(p->leftchild);} //if(p->rightchild!=NULL){q.push(p->rightchild);} //}};Void BinTree::destroy(BinTreeNode*subTree) // if(subTree!=NULL){ destroy(subTree->leftchild);destroy(subTree->rightchild); delete subTree;左子女进队右子女进队释放空间{}};void Print_BinTree(BinTreeNode* Tree,int i)// 按要求输出二叉树,i 表示结点所在层次,初次调用为0 8{ BinTreeNode*p=Tree;if(p->rightchild) Print_BinTree(Tree->rightchild,i+1);for(int j=1;j<=i;j++) cout<<""; // 打印i 个空格表示层次cout<<p->data<<endl; // 打印元素,换行if(p->leftchild) Print_BinTree(Tree->leftchild,i+1);};int main(){BinTree Tree;int a;int i=0;cout<<" 请按照前序遍历的方法,输入初始值,每段空格结束<<endl; cin>>Tree;BinTreeNode*p=Tree.getroot();cout<<endl;cout<<" 层序遍历为:"<<endl;Tree.levelOrder(p);cout<<endl;cout<<" 按树形打印输出二叉树"<<endl;10 Prin t_Bi nTree(p,i);cin>>a;return 0;}6.2运行结果图三:输入错误的运行结果9图四:输入正确的运行结果7参考文献[1] 《数据结构习题集(C 语言版)》,严蔚敏,吴伟民,米宁编著,清华大学 出版社,出版或修订时间:1999年2月[2] 《数据结构(用面向对象方法与C+H 语言描述)(第二版)》,殷人昆主编,清 华大学出版社,出版或修订时间:2007年6月[3] 《C++S 序设计》,闵联营,何克右编写,清华大学出版社, 2010年8月本科生课程设计成绩评定表班级姓名: 学号: 序号评分项目满分实得分1 学习态度认真、遵守纪律102 设计分析合理性103 设计方案正确性、可行性、创造性204 设计结果正确性405 设计报告的规范性106 设计验收10总得分/ 等级评语:注: 最终成绩以五级分制记。

相关文档
最新文档