二叉树层次遍历
算法与数据结构设计报告
( 2012 / 2013 学年第二学期)
题目:二叉树的层次遍历
专业计算机科学与技术
学生姓名
班级学号
指导教师
指导单位计算机学院计算机科学与技术系
日期 2013年6月3日
一、课题名称
课程设计题目3:二叉树的层次遍历
二、课题内容和要求
设计要求:任意选定一棵至少含有8个结点的二叉树,编程实现:
(1)按层次遍历算法遍历该二叉树,并给出遍历结果;
(2)利用层次遍历算法显示所有叶结点。
(3)具体设计要求:
I.用队列存储二叉树结点。
II.算法实现层次遍历。
三、需求分析
树型结构是一类重要的非线性数据结构,其中二叉树最重要。树结构在客观世界中广泛存在,如人类社会的族谱和各种社会组织机构够可以用树来形象表示。树在计算机领域中也得到了广泛应用,如在编译程序中,可以用树来表示源程序的语法结构。二叉树是一种非线性数据结构,对它进行操作时总需要对每个数据逐一进行操作,这样就存在一个操作顺序问题,由此提出了二叉树的遍历操作问题,所谓遍历二叉树就是按某种顺序访问二叉树中某个结点一次且仅一次的过程,这里的访问可以是输出.比较.更新.查看元素内容等各种操作。本程序要求层次遍历算法遍历一棵至少含有8个结点的二叉树,并给出遍历结果。利用层次遍历算法显示所有叶结点。
【队列部分】
用队列存储二叉树结点。
【层次遍历模块】
算法实现层次遍历。并给出遍历结果。
【结点访问模块】
访问所有叶子结点,并显示所有叶结点。
四、概要设计
在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义,如果用面向对象的方法,应该给出类中成员变量和成员函数原型声明)。
【主函数流程图】
【层次遍历算法】
采用队列存储结点是结合层次遍历二叉树和队列“先进先出”的特点综合考虑的,因为层次遍历即从上到下从左到右依次遍历二叉树结点,而队列恰好可以从上到下从左到右顺序进队然后顺序出队,符合设计的要求。
【节点访问模块】
通过寻找结点是否有左孩子或右孩子来实现对于结点是否为叶子结点。再将访问得到的叶子结点输出。
五、详细设计
【二叉树节点类】
struct BTNode
{
BTNode(){ lChild=rChild=NULL;}
BTNode(const T& x)
{
element=x; lChild=rChild=NULL;
}
BTNode(const T& x,BTNode
{
element=x; lChild=l; rChild=r;
}
T element;
BTNode
};
【二叉树类】
class BinaryTree
{
public:
static int total;
BinaryTree() {root=NULL;}
~BinaryTree(){Clear(root);};
bool IsEmpty()const;
bool Root(T& x)const;
void MakeTree(const T& x,BinaryTree
void BreakTree(T& x,BinaryTree
int Depth();
int leaves();
BTNode
void Exchange();
void InputRoot(BTNode
void LevelOrder(void (*Visit)(T& x));
protected:
BTNode
private:
void Clear(BTNode
int Depth(BTNode
void leaves(BTNode
int leaves1(BTNode
void LevelOrder(void (*Visit)(T& x),BTNode
};
【二叉树的部分运算】
Maketree运算
void BinaryTree
{
if(root||&left==&right) return;
root=new BTNode
left.root=right.root=NULL;
}
Breaktree运算
void BinaryTree
if(!root||&left==&right||left.root||right.root) return;
x=root->element;
left.root=root->lChild;right.root=root->rChild;
delete root; root=NULL;
}
Root运算
bool BinaryTree
{
if(root){
x=root->element; return true;
}
else return false;
}
【节点访问】
void Visit(T& x)
{
cout< } 【层次遍历算法】 void BinaryTree LevelOrder(Visit,root); } template void BinaryTree const MaxSize=30; BTNode int front=0,rear=0; BTNode if(t) { rear=(rear+1)%MaxSize;//防溢出 Q[rear]=t; } while(front!=rear) { front=(front+1)%MaxSize; p=Q[front]; //移动头指针向下传递 cout< if(p->lChild) //左孩子进队 { rear=(rear+1)%MaxSize; Q[rear]=p->lChild; } if(p->rChild) //右孩子进队 { rear=(rear+1)%MaxSize; Q[rear]=p->rChild; } } } 【叶结点数量,叶结点判断】 int BinaryTree { return leaves1(root); } template int BinaryTree { if(!root) return 0; if(((!root->lChild) && (!root->rChild))) { cout< return 1; } return leaves1(root->lChild)+leaves1(root->rChild); } 【树高计算】 int BinaryTree { int h1=0,h2=0; if(!root) return 0; else{ h1=Depth(root->lChild); h2=Depth(root->rChild); if(h1>=h2) return h1+1;//返回左右子树较高的 else return h2+1; } } 【主函数】 void main(void) { BinaryTree y.MakeTree('E',a,b); z.MakeTree('F',a,b); x.MakeTree('C',y,z); y.MakeTree('D',a,b); z.MakeTree('B',y,x); y.MakeTree('A',a,b); x.MakeTree('H',z,y); z.MakeTree('G',y,x); cout<<"层次遍历结果:"< z.LevelOrder(Visit); cout< cout<<"树的高度是:"< cout<<"是叶子结点,其个数为:"< } 六、测试数据及其结果分析 建立二叉树先序遍历: GHBADCEF 结果: 结果分析:实验结果的排序完全正确。客户可以通过该程序对任意二叉树的输入实现对二叉树的层次遍历。程序基本上满足了算法设计要求,但是仍有地方值得提高,仍需完善。 七、调试过程中的问题 在写程序的过程中遇到的麻烦不是很多,由于课本上都把最基本的算法写的很清楚,我们只需要去理解,把分散的知识聚拢来,用学过的知识把一个一个的排序恰当的连接起来就能把程序的主要部分写好,再加一修改就可以了,所以这对于我们来说还是比较轻松的一件事,但是在写程序的过程中还是会遇到一些麻烦,那就需要我们的小心谨慎和积极探索的精神了,争取把程序写的更完美。 做课程设计使我知道一个道理:编程需要兴趣和实际动手。这应该可以借鉴在老师的教学工作上。创新思维至关重要,这不仅能让我们写出精简的代码,也有助于开发出高效的程序。 八、程序设计总结 通过本次课程设计,使我对数据结构这门课的认识更进一步,数据结构作为计算机专业的一门必修课,对如何编写好的算法进行了比较深入的阐述,为我们写出正确的,强壮的代码奠定了基础。在做课程设计的过程中,从查阅的相关资料和问题的解决中学到了不少的知识,因此对课本上的知识也有了更深入的了解。这次课使我了解我编程思想和编程技巧,也认识了软件生命周期的各个环境,包括构思、设计、编写、调试、发布、文档化、维护和修订。编程的风格也很重要,同学只关心程序运行的结果,如果我们希望将来从事编程工作,在这一点上该引起足够的重视。我们应当有更加严谨的态度,这样才能出现更为优秀的程序来解决实际问题。 二叉树的各种算法.txt男人的承诺就像80岁老太太的牙齿,很少有真的。你嗜烟成性的时候,只有三种人会高兴,医生你的仇人和卖香烟的。 /*用函数实现如下二叉排序树算法: (1)插入新结点 (2)前序、中序、后序遍历二叉树 (3)中序遍历的非递归算法 (4)层次遍历二叉树 (5)在二叉树中查找给定关键字(函数返回值为成功1,失败0) (6)交换各结点的左右子树 (7)求二叉树的深度 (8)叶子结点数 Input 第一行:准备建树的结点个数n 第二行:输入n个整数,用空格分隔 第三行:输入待查找的关键字 第四行:输入待查找的关键字 第五行:输入待插入的关键字 Output 第一行:二叉树的先序遍历序列 第二行:二叉树的中序遍历序列 第三行:二叉树的后序遍历序列 第四行:查找结果 第五行:查找结果 第六行~第八行:插入新结点后的二叉树的先、中、序遍历序列 第九行:插入新结点后的二叉树的中序遍历序列(非递归算法) 第十行:插入新结点后的二叉树的层次遍历序列 第十一行~第十三行:第一次交换各结点的左右子树后的先、中、后序遍历序列 第十四行~第十六行:第二次交换各结点的左右子树后的先、中、后序遍历序列 第十七行:二叉树的深度 第十八行:叶子结点数 */ #include "stdio.h" #include "malloc.h" #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 typedef int Status; typedef int KeyType; #define STACK_INIT_SIZE 100 // 存储空间初始分配量 #define STACKINCREMENT 10 // 存储空间分配增量 #define MAXQSIZE 100 typedef int ElemType; typedef struct BiTNode{ ElemType data; struct BiTNode *lchild,*rchild;//左右孩子指针 } BiTNode,*BiTree; Status SearchBST(BiTree T,KeyType key,BiTree f,BiTree &p) { if(!T){p=f;return FALSE;} else if(key==T->data){p=T;return TRUE;} else if(key 第六章 树和二叉树 一、选择题 1.算术表达式a+b*(c+d/e )转为后缀表达式后为( B ) A .ab+cde/* B .abcde/+*+ C .abcde/*++ D .2. 设有一表示算术表达式的二叉树(见下图), 它所表示的算术表达式是( C ) A. A*B+C/(D*E)+(F-G) B. (A*B+C)/(D*E)+(F-G) C. (A*B+C)/(D*E+(F-G )) D. A*B+C/D*E+F-G 3. 设树T 的度为4,其中度为1,2,3和4的结点个数分别为4,2,1 ,1 则T 中的叶子数为( D ) A .5 B .6 C .7 D .8 4. 在下述结论中,正确的是( D ) ①只有一个结点的二叉树的度为0; ②二叉树的度为2; ③二叉树的左右子树可任意 交换; ④深度为K 的完全二叉树的结点个数小于或等于深度相同的满二叉树。 A .①②③ B .②③④ C .②④ D .①④ 5. 设森林F 对应的二叉树为B ,它有m 个结点,B 的根为p,p 的右子树结点个数为n,森林F 中第一棵树的结点个数是( A ) A .m-n B .m-n-1 C .n+1 D .条件不足,无法确定 6.若一棵二叉树具有10个度为2的结点,5个度为1的结点,则度为0的结点个数是( B ) A .9 B .11 C .15 D .不确定 7.设森林F 中有三棵树,第一,第二,第三棵树的结点个数分别为M1,M2和M3。与森林F 对应的二叉树根结点的右子树上的结点个数是( D )。 A .M1 B .M1+M2 C .M3 D .M2+M3 8.一棵完全二叉树上有1001个结点,其中叶子结点的个数是( E ) A . 250 B . 500 C .254 D .505 E .以上答案都不对 9. 有关二叉树下列说法正确的是( B ) A .二叉树的度为2 B .一棵二叉树的度可以小于2 C .二叉树中至少有一个结点的度为2 D .二叉树中任何一个结点的度都为2 10.二叉树的第I 层上最多含有结点数为( C ) A .2I B . 2I-1-1 C . 2I-1 D .2I -1 11. 一个具有1025个结点的二叉树的高h 为( C ) A .11 B .10 C .11至1025之间 D .10至1024之间 12.一棵二叉树高度为h,所有结点的度或为0,或为2,则这棵二叉树最少有( B )结点 A .2h B .2h-1 C .2h+1 D .h+1 13. 一棵树高为K 的完全二叉树至少有( C )个结点 A .2k –1 B. 2k-1 –1 C. 2k-1 D. 2 k 14.对二叉树的结点从1开始进行连续编号,要求每个结点的编号大于其左、右孩子的编号,同一结点的左右孩子中,其左孩子的编号小于其右孩子的编号,可采用( C )次序的遍历 实现编号。 A .先序 B. 中序 C. 后序 D. 从根开始按层次遍历 15.一棵二叉树的前序遍历序列为ABCDEFG ,它的中序遍历序列可能是( B ) 二叉树层次遍历算法实现 问题描述 对任意输入的表示某二叉树的字符序列,完成二叉树的层次遍历算法,并输出其遍历结果。 注:所需Queue ADT的实现见附录。 输入描述 从键盘上输入一串字符串,该字符串为二叉树的先序遍历结果,其中如果遍历到空树时用字符”#”代替。 输出描述 从显示器上输出二叉树的按层次遍历结果。 输入与输出示例 输入: +A##/*B##C##D## 输出: +A/*DBC 输入: ABD##GJ###CFH##I### 输出: ABCDGFJHI 附录(仅供参考): #include //注:需要定义ElementType类型,如果是二叉树, // 则应定义为指向二叉树中结点的指针类型 //格式如: // typedef Tree ElementType; // 队列存储结构采用循环队列 struct QueueRecord; typedef struct QueueRecord *Queue; int IsEmpty(Queue Q); int IsFull(Queue Q); Queue CreateQueue(int MaxElements); void DisposeQueue(Queue Q); void MakeEmpty(Queue Q); int Enqueue(ElementType X, Queue Q); ElementType Front(Queue Q); int Dequeue(Queue Q, ElementType &X); #define MinQueueSize ( 5 ) struct QueueRecord { int Capacity; int Front; int Rear; ElementType *Array; }; int IsEmpty(Queue Q) { return ((Q->Rear + 1)% Q->Capacity == Q->Front); } int IsFull(Queue Q) { return ((Q->Rear + 2) % Q->Capacity == Q->Front); } Queue CreateQueue(int MaxElements) { Queue Q; if (MaxElements < MinQueueSize) return NULL; Q = (Queue)malloc(sizeof(struct QueueRecord)); 二叉树遍历算法的实现 题目:编制二叉树遍历算法的实现的程序 一.需求分析 1.本演示程序中,二叉树的数据元素定义为非负的整型(unsigned int)数据,输 入-1表示该处没有节点 2.本演示程序输入二叉树数据均是按先序顺序依次输入 3.演示程序以用户和计算机对话方式执行,即在计算机终端上显示“提示信息” 之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运 算结果显示在其后 4.本实验一共包括三个主要程序,分别是:1)二叉树前序,中序,后序遍历递归 算法实现2)二叉树前序中序遍历非递归算法实现3)二叉树层次遍历算法实现 5.本程序执行命令包括:1)构建二叉树2)二叉树前序递归遍历3)二叉树中序 递归遍历4)二叉树后序递归遍历5)二叉树前序非递归遍历6)二叉树中序非 递归遍历7)二叉树层次遍历 6.测试数据 (1)7 8 -1 9 10 -1 -1 -1 6 11 -1 -1 12 13 -1 -1 14 -1 -1 (2)1 -1 -1 (3)7 8 -1 -1 9 -1 -1 二.概要设计 1.为实现二叉树的遍历算法,我们首先给出如下抽象数据类型 1)二叉树的抽象数据类型 ADT BiTree{ 数据对象D:D是具有相同特性的数据元素的集合 数据关系R: 若D=Φ,则R=Φ,称BiTree是空二叉树; 若D≠Φ,则R={H},H是如下二元关系: (1)在D中存在唯一的成为根的数据元素root,它在关系H下无前驱; (2)若D-{H}≠Φ,则存在D-{root}={D1,D r},且D1∩D r=Φ (3)若D1≠Φ,则D1中存在唯一的元素x1, 掌握二叉树的二叉链表存储结构;掌握二叉树的遍历规则;利用二叉树的二叉链表存储结构实现二叉树的建树操作;利用二叉树的二叉链表存储结构实现二叉树层次遍历操作 二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树----队列形式 #include int EmptyQueue(Queue *Q) { if(Q->front==Q->rear) return 1; else return 0; } void EnQueue(Queue *Q,BitNode *e) { Q->base[Q->rear].data=e; Q->rear++; } BiTree DeQueue(Queue *Q) { int m; m=Q->front; Q->front++; return (Q->base[m].data); } char a[50]; BiTree CreatBiTree(BiTree T) { BiTree p; BiTree s[STACK_MAX_SIZE]; int top = -1; int flag; int i = 0; T=NULL; while(a[i]!='#') { switch(a[i]) {case' ':break; case '(': top++; 二叉树实验报告 09信管石旭琳 20091004418 一、实验目的: 1、理解二叉树的遍历算法及应用 2、理解哈夫曼树及其应用。 3、掌握哈夫曼编码思想。 二、实验内容: 1、建立二叉树二叉链表 2、实现二叉树递归遍历算法(中序、前序、后序) 3、求二叉树高度 4、求二叉树结点个数 5、求二叉树叶子个数 6、将序号为偶数的值赋给左子树 三、主要程序: #include 数据结构课程设计--按层次遍历二叉树学号: 题目按层次遍历二叉树学院计算机科学与技术专业计算机科学与技术 班级 姓名 指导教师 2013年6月20日 1 1问题描述及要求 (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周完成,验收时间由指导教师指定 课程设计 题目按层次遍历二叉树 学院计算机科学与技术 专业计算机科学与技术 班级0801 姓名陈新 指导教师孙玉芬 2012 年 6 月20 日 课程设计任务书 学生姓名:专业班级: 指导教师:孙玉芬工作单位:计算机科学系 题目: 按层次遍历二叉树 初始条件: 编写按层次顺序(同一层自左至右)遍历二叉树的算法。 (1)二叉树采用二叉链表作为存储结构。 (2)按题集p44面题6.69所指定的格式输出建立的二叉树。 (3)输出层次遍历结果。 (4)测试用例自己设计。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容: 1、问题描述 简述题目要解决的问题是什么。 2、设计 存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计; 3、调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。 4、经验和体会(包括对算法改进的设想) 5、附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出, 6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。 时间安排: 1、第19周完成。 2、6月21日8:00到计算中心检查程序、交课程设计报告、源程序。 指导教师签名: 系主任(或责任教师)签名:年月日 数据结构课程设计 ——按层次遍历二叉树 1问题描述及要求 1.1问题描述 编写按层次顺序(同一层自左至右)遍历二叉树的算法。 1.2任务要求 编写按层次顺序(同一层自左至右)遍历二叉树的算法。 (1)二叉树采用二叉链表作为存储结构。 (2)按题集p44面题6.69所指定的格式输出建立的二叉树。 (3)输出层次遍历结果。 (4)测试用例自己设计。 2开发平台及所使用软件 Windows 7.0 , Visual C++6.0 3程序设计思路 3.1二叉树存储结构设计 typedef char ElemType; //二叉树结点值的类型为字符型 typedef struct BiTNode{ //二叉树的二叉链表存储表示 ElemType date; struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; 3.2题目算法设计 3.2.1建立二叉树 void CreateBinTree(BinTree &T){ //按先序次序输入,构造二叉链表表示的二叉树T char ch; ch=getchar(); //输入函数。 if(ch==’’) T=NULL; //输入空格时为空 else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("%c" "结点建立失败!") ; T->data=ch; CreateBinTree(T->lchild); CreateBinTree(T->rchild); 本文由我司收集整编,推荐下载,如有疑问,请与我司联系JAVA 实现二叉树的前序遍历、中序遍历、后序遍历和层次遍历算法 JAVA 实现二叉树的前序遍历、中序遍历、后序遍历和层次遍历算法如图所 示一颗二叉树,用JAVA 实现二叉树的前序遍历、中序遍历、后序遍历和层次遍历 算法 定义树节点 public class TreeNode { int data; TreeNode leftChild; TreeNode rightChild; TreeNode(){ this.leftChild=null; this.rightChild=null; this.data=-1; TreeNode(int data){ this.leftChild=null; this.rightChild=null; this.data=data; public TreeNode(int data, TreeNode leftChild, TreeNode rightChild) { this.data = data; this.leftChild = leftChild; this.rightChild = rightChild; //其它代码省略……二叉树的前序遍历、中序遍历、后 序遍历和层次遍历算法设计 package com.bean.binarytreedemo;import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.util.Queue;import java.util.Stack; //给定一个一维数组,表示二叉树节点的值private int[] array = { 1, 2, 3, 4, 5, 6, 7, 8, 9 }; private static List TreeNode nodeList = null; public void createBinTree() { nodeList = new LinkedList TreeNode // 将一个数组的值依次转换为Node 节点for (int nodeIndex = 0; nodeIndex array.length; nodeIndex++) { nodeList.add(new TreeNode(array[nodeIndex])); // 对前lastParentIndex-1 个父节点按照父节点与孩子节点的数字关系建立二叉树for (int parentIndex = 0; parentIndex array.length / 2 - 1; parentIndex++) { // 左孩子nodeList.get(parentIndex).leftChild = nodeList .get(parentIndex * 2 + 1); // 右孩子nodeList.get(parentIndex).rightChild = nodeList .get(parentIndex * 2 + 2); // 最后一个父节点:因为最后一个父节点可能没 有右孩子,因此单独拿出来处理int lastParentIndex = array.length / 2 - 1; // 左孩子nodeList.get(lastParentIndex).leftChild = nodeList .get(lastParentIndex * 2 + 1); // 右孩子,如果数组的长度为奇数才建立右孩子if (array.length % 2 == 1) { 数据结构实验四树与二叉树 班级学号姓名分数 一、实验目的: 1、掌握二叉树的定义、性质及存储方式,各种遍历算法。 2、掌握这种存储结构的构造算法以及基于每一种结构上的算法设计 3、初步掌握算法分析方法并对已设计出的算法进行分析,给出相应的结果。 二、实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历的操作,求所有叶子及结点总数的操作。 三、实验内容及分析: 1、分析、理解程序。 2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针), 如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求所有叶子及结点总数。 四、程序的调试及运行结果 先序遍历 中序遍历 后序遍历 树的深度及叶子树 层次遍历 五、程序代码 #include"stdio.h" #include"stdlib.h" #include"string.h" #define Max 20 //结点的最大个数 typedef struct node{ char data; struct node *lchild,*rchild; }BinTNode; //自定义二叉树的结点类型 typedef BinTNode *BinTree; //定义二叉树的指针 int NodeNum,leaf; //NodeNum为结点数,leaf为叶子数 //==========基于先序遍历算法创建二叉树============== //=====要求输入先序序列,其中加入虚结点"#"以示空指针的位置========== BinTree CreatBinTree(void) { BinTree T; char ch; if((ch=getchar())=='#') return(NULL); //读入#,返回空指针 else{ T= (BinTNode *)malloc(sizeof(BinTNode)); //生成结点 T->data=ch; T->lchild=CreatBinTree(); //构造左子树 T->rchild=CreatBinTree(); //构造右子树 return(T); } } //========NLR 先序遍历============= void Preorder(BinTree T) { if(T) { printf("%c",T->data); //访问结点 Preorder(T->lchild); //先序遍历左子树 Preorder(T->rchild); //先序遍历右子树 } } //========LNR 中序遍历=============== void Inorder(BinTree T) { if(T) { Inorder(T->lchild); //中序遍历左子树 printf("%c",T->data); //访问结点 Inorder(T->rchild); //中序遍历右子树 } } //==========LRN 后序遍历============ void Postorder(BinTree T) { if(T) { Postorder(T->lchild); //后序遍历左子树 #include printf("%c",T->data); } void PreOrder(BiTree T)//先序遍历 { if(T) { visit(T); PreOrder(T->lchild); PreOrder(T->rchild); } } void InOrder(BiTree T)//中序遍历 { if(T) { InOrder(T->lchild); visit(T); InOrder(T->rchild); } } void PostOrder(BiTree T)//后序遍历 { if(T) { PostOrder(T->lchild); PostOrder(T->rchild); visit(T); } } void InitQueue(LinkQueue *Q){ (*Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode)); if((*Q).front) (*Q).front->next=NULL; } int QueueEmpty(LinkQueue Q){ if(Q.front==Q.rear)return 0; return 1; } C#实现二叉树遍历算法 用C#2.0实现了二叉树的定义,怎么构造一颗已知的二叉树,用几种常规的算法(先序,中序,后序,层次)遍历二叉树。希望能给有需要人带来帮助,也希望能得到大家的指点。有关C#数据结构的书在书店里找到,网上也是极少,如果你有好的学习资源别忘了告诉我。先谢了。数据结构对一个程序员来说,现在是太重要了,数据结构学得好的人,逻辑思维一定很强,在程序设计的时候,就不会觉得太费劲了。而且是在设计多层应用程序的时候,真是让人绞尽脑汁啊。趁自己还年轻,赶紧练练脑子。哈哈,咱们尽快进入主题吧。 本程序中将用到一棵已知的二叉树如图(二叉树图)所示。 下面简单介绍一下几种算法和思路: 先序遍历: 1. 访问根结点 2. 按先序遍历左子树; 3. 按先序遍历右子树; 4. 例如:遍历已知二叉树结果为:A->B->D->G->H->C->E->F 中序遍历: 1. 按中序遍历左子树; 2. 访问根结点; 3. 按中序遍历右子树; 4. 例如遍历已知二叉树的结果:B->G->D->H->A->E->C->F 后序遍历: 1. 按后序遍历左子树; 2. 按后序遍历右子树; 3. 访问根结点; 4. 例如遍历已知二叉树的结果:G->H->D->B->E->F->C->A 层次遍历: 1. 从上到下,从左到右遍历二叉树的各个结点(实现时需要借辅助容器); 2. 例如遍历已知二叉树的结果:A->B->C->D->E->F->G->H 附加整个解决方案代码: 二叉遍历算法解决方案 using System; using System.Collections.Generic; 问题一:二叉树遍历 1.问题描述 设输入该二叉树的前序序列为: ABC##DE#G##F##HI##J#K##(#代表空子树) 请编程完成下列任务: ⑴请根据此输入来建立该二叉树,并输出该二叉树的前序、中序和后序序列; ⑵按层次遍历的方法来输出该二叉树按层次遍历的序列; ⑶求该二叉树的高度。 2.设计描述 (1)二叉树是一种树形结构,遍历就是要让树中的所有节点被且仅被访问一次,即按一定规律排列成一个线性队列。二叉(子)树是一种递归定义的结构,包含三个部分:根结点(N)、左子树(L)、右子树(R)。根据这三个部分的访问次序对二叉树的遍历进行分类,总共有6种遍历方案:NLR、LNR、LRN、NRL、RNL和LNR。研究二叉树的遍历就是研究这6种具体的遍历方案,显然根据简单的对称性,左子树和右子树的遍历可互换,即NLR与NRL、LNR与RNL、LRN与RLN,分别相类似,因而只需研究NLR、LNR和LRN三种即可,分别称为“先序遍历”、“中序遍历”和“后序遍历”。采用递归方式就可以容易的实现二叉树的遍历,算法简单且直观。 (2)此外,二叉树的层次遍历即按照二叉树的层次结构进行遍历,按照从上到下,同一层从左到右的次序访问各节点。遍历算法可以利用队列来实现,开始时将整个树的根节点入队,然后每从队列中删除一个节点并输出该节点的值时,都将它的非空的左右子树入队,当队列结束时算法结束。 (3)计算二叉树高度也是利用递归来实现:若一颗二叉树为空,则它的深度为0,否则深度等于左右子树的最大深度加一。 3.源程序 1 2 3 4 5 6 7 8#include <> #include <> #include <> #define ElemType char struct BTreeNode { ElemType data; struct BTreeNode* left; struct BTreeNode* right; 青岛理工大学数据结构课程实验报告 void PreOrderTraverse(BiTree T,Status(*Visit)(TElemType e)){ if(T){ Visit(T->data);//首先访问根结点 PreOrderTraverse(T->lchild,Visit);//然后递归遍历左子树 PreOrderTraverse(T->rchild,Visit);//最后递归遍历右子树}} //中序遍历时先递归遍历左子树,然后访问根结点,最后递归遍历右子树;后序遍历时先递归遍历左子树,然后递归遍历右子树,最后 访问根结点 3、//先把栈及队列相关操作的头文件包括进来 1)根指针入栈, 2)向左走到左尽头(入栈操作) 3)出栈,访问结点 4)向右走一步,入栈,循环到第二步,直到栈空 //层次遍历时,若树不空,则首先访问根结点,然后,依照其双亲结 点访问的顺序,依次访问它们的左、右孩子结点; 4.首先建立二叉线索存储:包含数据域,左右孩子指针以及左右标志 typedef enum { Link=0,Thread=1 } PointerTag; typedef struct BiThrNode{ TElemType data; struct BiThrNode *lchild,*rchild;//左右孩子指针 PointerTag LTag,RTag;//左右标志 }BiThrNode, *BiThrTree; 建立前驱线索和后继线索,并用中序遍历进行中序线索化,然后最 后一个结点线索化 调 试 过 程 及 实 验 结 果 把测试数据放在f:\\file\\data.txt里,测试数据为:1 2 4 0 0 0 3 5 0 0 0 总访问结点是指访问该结点的数据域,弄清楚各个指针所指的类型 年级 2009 班号组号学号 专业数学与应用数学姓名 实验 名称 二叉树的遍历实验室9202 实 验 目的或要求 了解二叉树的定义、性质、存储结构等相关知识,在熟悉这些内容的基础上掌握二叉树在某种存储结构下遍历以及相关算法的实现及应用,能根据本章所学到的有关知识设计出有效的算法。 实验原理(算法流程)1、实验内容 二叉树的创建和遍历演示 (1)从键盘输入二叉树的各结点值,按先序递归方式创建二叉树 (2)分别实现先序、中序、后序递归遍历二叉树 (3)输出二叉树的按层次遍历序列 2、存储结构描述及说明 用链式存储结构储存二叉树,结点定义如下: typedef struct BiTNode { char data; struct BiTNode*lchild,*rchild; } data表示二叉树中的字符。lchild为指向一个包含(data lchild rchild)的结构体变量的指针变量,指向二叉树的左孩子。rchild为指向一个包含(data lchild rchild)的结构体变量的指针变量,指向二叉树的右孩子。 3、函数说明 BiTNode* CreatBiTree()是返回值为指向结构体指针的函数,带头结点,用于建立二叉树。 void PreOrderTraverse(): 是返回值为空的递归函数,用于二叉树的先序遍历。 void InOrderTraverse(BiTNode* T): 是返回值为空的递归函数,用于二叉树的中序遍历。 void PostOrderTraverse(BiTNode* T): 是返回值为空的递归函数,用于二叉树的后序遍历。 void LevelorderTraverse(BiTNode *T):是返回值为空的函数,用于二叉树的层次遍历。 4、模块之间的调用关系main PreOrderTraverse InOrderTraverse PostOrderTraverse LevelorderTraverse (写不完时,可另加附页。) 实验三二叉树遍历算法 一、实验目的 1.进一步理解掌握二叉树二叉链表存储结构。 2.掌握二叉树遍历的递归与非递归算法。 二、实验要求 1.认真阅读和掌握(先序、中序、后序和层次)遍历的递归与非递归算法。2.上机调试(先序、中序、后序和层次)遍历的递归与非递归算法。 3.保存和打印出程序的运行结果,并结合程序进行分析。 4.上机后,认真整理源程序及其注释,完成实验报告(包括源程序、实验结果、算法分析、心得体会等)。 三、实验容 先序、中序、后序遍历的递归与非递归算法和层次遍历的算法实现 程序: #include "stdio.h" #include "stdlib.h" #include "conio.h" #define maxsize 100 typedef int datatype; typedef struct bnode{ datatype data; struct bnode *lchild,*rchild; }bnode,*btree; typedef struct { bnode *node; int flag; }DataType; typedef struct{ DataType data[maxsize]; int top; }SeqStack,*PSeqStack; typedef struct { btree data[maxsize]; int front,rear; }SeqQueue,*PSeqQueue; typedef struct{ btree data[maxsize]; int top; }SeqStack1,*PSeqStack1; //建立一个二叉树 btree create() { btree t; char ch; scanf("%c",&ch); if(ch=='?') t=NULL; else { t=(btree)malloc(sizeof(bnode)); t->data=ch; t->lchild=create(); t->rchild=create(); } return t; } //先序遍历 //入栈操作 void push1(PSeqStack1 s,btree sq) { if(s->top==maxsize-1) printf("栈满不得入栈"); else { s->top++; s->data[s->top]=sq; } } //出栈操作 void pop1(PSeqStack1 s,btree *sq) { if(s->top==-1) printf("栈空不得出栈"); 学号:012091034001 课程设计 题目按层次输入建立二叉树 学院计算机科学与技术学院 专业计算机科学与技术专业 班级计算机0909 姓名樊旭 指导教师张霞 2011 年07 月03 日 目录 ●课程设计任务 书 (2) ●按层次建立二叉树的实 现 (3) 一、问题描述 (3) 二、设计 (3) 1、存储结构设计 (3) 2、主要算法设计 (3) 3、测试用例设计 (5) 三、调试报告 (5) 四、经验和体会 (6) 五、源程序清单和运行结果 (6) ●成绩评定 表 (10) 课程设计任务书 学生姓名:旭专业班级: 0909 班 指导教师:张霞工作单位:计算机科学系 题目: 按层次输入建立二叉树 初始条件: 按层次输入扩展的完全二叉树中的结点,建立一棵二叉树。 (1)用二叉链表作存储结构; (2)对建立的二叉树给出后序遍历的结果; (3)测试用例自己设计; 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 课程设计报告按学校规定格式用A4纸打印(书写),并应包含如下内容: 1、问题描述 简述题目要解决的问题是什么。 2、设计 存储结构设计、主要算法设计(用类C语言或用框图描述)、测试用例设计; 3、调试报告 调试过程中遇到的问题是如何解决的;对设计和编码的讨论和分析。 4、经验和体会(包括对算法改进的设想) 5、附源程序清单和运行结果。源程序要加注释。如果题目规定了测试数据,则运行结果要包含这些测试数据和运行输出, 6、设计报告、程序不得相互抄袭和拷贝;若有雷同,则所有雷同者成绩均为0分。 时间安排: 1、第19周完成。二叉树的各种算法
第6章树和二叉树习题
二叉树的层次遍历算法
二叉树遍历算法的实现
输入某棵二叉树的广义表形式,建立该二叉树并按层次遍历该二叉树队列形式
二叉树的遍历算法实验报告
数据结构课程设计--按层次遍历二叉树
层次遍历二叉树
JAVA实现二叉树的前序遍历、中序遍历、后序遍历和层次遍历算法
数据结构实验四 树与二叉树
队列实现二叉树遍历
C#实现二叉树遍历算法
数据结构二叉树遍历实验报告
二叉树的遍历及线索化
层次遍历
二叉树的遍历算法
按层次输入建立二叉树