当前位置:文档之家› 排序二叉树的建立及遍历的实现

排序二叉树的建立及遍历的实现

排序二叉树的建立及遍历的实现
排序二叉树的建立及遍历的实现

课程设计任务书

学生姓名:刘闯专业班级:计算机0502

指导教师:宋华珠工作单位:计算机科学与技术学院

题目: 二叉排序树的建立及遍历的实现

初始条件:

理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法;

实践:计算机技术系实验室提供计算机及软件开发环境。

要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能:

(1)建立二叉排序树;

(2)中序遍历二叉排序树并输出排序结果;

2、数据结构设计;

3、主要算法设计;

4、编程及上机实现;

5、撰写课程设计报告,包括:

(1)设计题目;

(2)摘要和关键字;

(3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等;

(4)结束语;

(5)参考文献。

时间安排:2007年7月2日-7日(第18周)

7月2日查阅资料

7月3日系统设计,数据结构设计,算法设计

7月4日-5日编程并上机调试7月6日撰写报告

7月7日验收程序,提交设计报告书。

指导教师签名: 2007年7月2日

系主任(或责任教师)签名: 2007年7月2日

排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据

组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。

关键字:排序二叉树,先序遍历,中序遍历,后序遍历

0.引言

我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。

该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归

调用,这将极大的方便算法设计。

1.需求分析

建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。

该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。

2.数据结构设计

在写算法之前,应对其进行数据结构设计。本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立

树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

结点结构体定义:

typedef struct tnode /*建立节点*/

{

int data;

struct tnode *lchild,*rchild;

}TNODE;

3.算法设计

在进行算法设计时,应将题目分为两部分,排序二叉树的建立,排序二叉树的遍历。

3.1 定义结点

typedef struct tnode /*建立节点*/

{

int data;

struct tnode *lchild,*rchild;

}TNODE;

TNODE *q; /*构造指针变量*/

TNODE *bt;

3.2 插入结点函数insert()

Void insert(TNODE **b,TNODE *s)

/*排序二叉树中插入节点*/

{

if((*b)==NULL)(*b)=s;

else if(s->data==(*b)->data) return;

else if(s->data<(*b)->data) insert((&(*b)->lchild),s);

else if(s->data>(*b)->data) insert((&(*b)->rchild),s);

}

3.3 创建树函数creat()

void creat(TNODE *b) /*建立排序二叉树*/ {

int x;

TNODE *s;

b=NULL; /*初始化二叉数*/

scanf("%d",&x);

s=(TNODE *)malloc(sizeof(TNODE));

q=s; /*将根结点指针地址赋值给q*/

while(x!=-1) /*反复读入节点,直至-1结束*/

{

s->data=x;

s->lchild=NULL;

s->rchild=NULL;

insert(&bt,s);

scanf("%d",&x); /*节点插入排序二叉树中*/

s=(TNODE *)malloc(sizeof(TNODE));

n=n+1;

}

}

3.4 求排序二叉树的深度

int deep(TNODE *t) /*求排序二叉树的深度 */

{

int rd;

int ld;

if(!t) return 0;

else { ld=deep(t->lchild);

rd=deep(t->rchild);

}

if(ld>rd) return ld+1;

else return rd+1;

}

3.5 建立先序遍历函数

void preorder(TNODE *p) /*先序遍历二叉树*/ {

if(p)

{

printf("%4d",p->data) ;

preorder(p->lchild);

preorder(p->rchild);

}

}

3.6 中序遍历

void inorder(TNODE *p) /*中序遍历二叉树*/ {

if(p)

{

inorder(p->lchild);

printf("%4d",p->data) ;

inorder(p->rchild);

}

}

3.7 后序遍历

void postorder(TNODE *p)/*后序遍历二叉树*/ {

if(p)

{

postorder(p->lchild);

postorder(p->rchild);

printf("%4d",p->data) ;

}

}

这三个函数都应用了递归调用。最后,在主函数中分别调用所建立的函数,

3.8 有关技术的讨论

在设计程序时,我发现用递归函数来写程序会简洁很多,能大大的缩小程序的代码,在求排序二叉树的深度,先序遍历排序二叉树,中序遍历排序二叉树以及和;后序遍历排序二叉树中,都用到了递归函数,大大简化了源程序的代码。

在输入数据时,用 while函数会使数据能够不断的输入进来,解决了无法从外部输入数据的问题,用的很巧妙。

4.程序实现

4.1 调入文件

#include

#include

#include

4.2 主函数main()

void main()/*主函数*/

{

printf("please insert the numbers(when you finish inserting numbers,please insert -1 to the end):\n");

creat(bt);/*构造排序二叉树*/

printf("the numbers of the nodes are:%4d",n);

/*输出排序二叉树的结点数*/

printf("\nthe depth of the tree:");

printf("%4d",deep(q)); /*求二叉树的深度*/

printf("\npreorder,the result is:");

preorder(q); /*先序遍历排序二叉树*/

printf("\ninorder,the result is:");

inorder(q); /*中序遍历排序二叉树*/

printf("\npostorder ,the result is:");

postorder(q); /*后序遍历排序二叉树*/

getchar();

}

然后输出结果。在设计中,最难的那一部分为求插入结点函数,在函数内部要进行比较,将较小的数赋给左子树,将将较大的数赋给右子树。在其他的算法设计中,只要理清思路就不会太难。

4.3 运行结果

显示程序:

输入数据:

输出结果:

5.设计体会

我感受最深的一点是以前用C编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的思路该怎么设计,在哪一阶段该设计什么。经过这一次设计,我学会了怎样设计程序,怎样控制整个程序,它使我学会了怎样设计程序,设计算法,设计课题。

通过这个星期的课程设计,我的收获还是不少。我的c语言水平有了比较大的提高,其中c语言关于指针,链表的操作理解的比以前深刻不少。另外是数据结构方面的提高,对存储结构,及各种查找排序方面也有不少的提高。虽然我做的程序里还有写问题,做的不够深入,但独立完成一个比较大一点的程序的经历也是很宝贵的。

通过这次课程设计我觉得我们学习《数据结构》的方法存在一定的弊端《数据结构》的效果直接影响到我们对其它专业课的学习和今后业务的成长。我觉得我们对于《数据结构》的学习不仅包括理论部分的学习,还要让我们勤动手,多实践。整个实验过程要结合教学进度与我们的实际情况,制定实验的内容。实验分两部分,一是验证性的,主要结合课堂理论教学内容展开,学生可以对在课堂上学到的基本算法进行验证;二是设计性实验,坚持“学以致用”的原则,目的是让学生充分利用所学的理论知识进行相对复杂的应用设计,以进一步提高综合能力和创新实践能力。

通过这次设计,我感慨颇多,的确,从选题到定稿,从理论到实践,在一个星期的日子里,可以说得是苦多于甜,但是可以学到很多很多的的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。在设计的过程中遇到问题,可以说得是困难重重,这毕竟第一次做的,难免会遇到过各种各样的问题,同时在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,通过这次课程设计之后,一定把以前所学过的知识重新温故。

6.结束语

本文主要是排序二叉树的建立及其遍历的实现,其主要功能有:对输入的数据形成排序二叉树,并求出排序二叉树的节点和深度,并对排序二叉树进行先序遍历,中序遍历和后序遍历,输出其结果。

参考资料

[1]严蔚敏, 吴伟名.《数据结构》清华大学出版社 2001年1月

[2]谭浩强.《C程序设计》清华大学出版社 2002年1月

[3]赵仲孟 ,张蓓. 《数据结构典型题解析》西北工业大学出版社 2002年8月

[4]钱能编.《 C++程序设计教程》清华大学出版社 2005年2月

创建一个二叉树并输出三种遍历结果

实验报告 课程名称数据结构 实验项目实验三--创建一个二叉树并输出三种遍历结果 系别■计算机学院 _________________ 专业_______________ 班级/学号_____________ 学生姓名___________ 实验日期— 成绩______________________________ 指导 教师

实验题目:实验三创建一个二叉树并输出三种遍历结果 实验目的 1)掌握二叉树存储结构; 2)掌握并实现二叉树遍历的递归算法和非递归算法; 3)理解树及森林对二叉树的转换; 4)理解二叉树的应用一哈夫曼编码及WPL计算。 实验内容 1)以广义表或遍历序列形式创建一个二叉树,存储结构自选; 2)输出先序、中序、后序遍历序列; 3)二选一应用题:1)树和森林向二叉树转换;2)哈夫曼编码的应用问题。 题目可替换上述前两项实验内容) 设计与编码 1)程序结构基本设计框架 (提示:请根据所选定题目,描述程序的基本框架,可以用流程图、界面描述图、 框图等来表示) 2)本实验用到的理论知识遍历二叉树,递归和非递归的方法 (应用型

(提示:总结本实验用到的理论知识,实现理论与实践相结合。总结尽量简明扼要,并与本次实验密切相关,要求结合自己的题目并阐述自己的理解和想法) 3) 具体算法设计 1) 首先,定义二叉树的存储结构为二叉链表存储,每个元素的数 据类型Elemtype,定义一棵二叉树,只需定义其根指针。 2) 然后以递归的先序遍历方法创建二叉树,函数为CreateTree(),在输 入字符时要注意,当节点的左孩子或者右孩子为空的时候,应当输入一 个特殊的字符(本算法为“ #”),表示左孩子或者右孩子为空。 3) 下一步,创建利用递归方法先序遍历二叉树的函数,函数为 PreOrderTreeQ,创建非递归方法中序遍历二叉树的函数,函数为 InOrderTree(),中序遍历过程是:从二叉树的根节点开始,沿左子树 向下搜索,在搜索过程将所遇到的节点进栈;左子树遍历完毕后,从 栈顶退出栈中的节点并访问;然后再用上述过程遍历右子树,依次类 推,指导整棵二叉树全部访问完毕。创建递归方法后序遍历二叉树的 函数,函数为LaOrderTree()。 (提示:该部分主要是利用C、C++ 等完成数据结构定义、设计算法实现各种操作,可以用列表分步形式的自然语言描述,也可以利用流程图等描述) 4) 编码 #include #include #include typedef char DataType; #define MaxSize 100 typedef struct Node { DataType data; struct Node *lchild; struct Node *rchild; } *BiTree,BitNode;

已知某二叉树的先序遍历和中序遍历的结果是先序遍历ABDEGCF

树与二叉树复习 一、填空 1、由二叉树的(中)序和(前、后)序遍历序列可以唯一确定一棵二叉树。 2、任意一棵二叉树,若度为0的结点个数为n0,度为2的结点个数为n2,则n0等于(n0=n2+1 )。 3、一棵二叉树的第i(i≥1)层最多有(2i-1 )个结点。 4、一棵有n个结点的二叉树,若它有n0个叶子结点,则该二叉树上度为1的结点个数n1=(n-2n0+1 )。 5、在一棵高度为5的完全二叉树中,最少含有( 16 )个结点。 6、 2.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当折半查找值为82的结点时,( C )次比较后查找成功。 A. 11 B 5 C 4 D 8 7、在有n个叶结点的哈夫曼树中,总结点数( 2n-1 )。 8、若一个问题的求解既可以用递归算法,也可以用递推算法,则往往用(递推)算法,因为(递推算法效率高)。 9、设一棵完全二叉树有700个结点,则共有( 350 )叶子结点。 10、设一棵完全二叉树具有1000个结点,该树有(500)个叶子结点,有(499 )个度为2的结点,有( 1 )个结点只有非空左子树。 二、判断 1、( × )在哈夫曼树中,权值最小的结点离根结点最近。 2、( √ ) 完全二叉树中,若一个结点没有左孩子,则它必是叶子结点。 3、( √ )二叉树的前序遍历序列中,任意一个结点均处在其孩子结点的前面。 4、( × ) 若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最大值一定在叶结点上。 5、( √ )若以二叉链表作为树和二叉树的存储结构,则给定任一棵树都可以找到唯一的一棵二叉树与之对应。 6、( √ )若一搜索树(查找树)是一个有n个结点的完全二叉树,则该树的最小

二叉排序树的建立及遍历的实现

课程设计任务书 题目: 二叉排序树的建立及遍历的实现 初始条件: 理论:学习了《数据结构》课程,掌握了基本的数据结构和常用的算法; 实践:计算机技术系实验室提供计算机及软件开发环境。 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、系统应具备的功能: (1)建立二叉排序树; (2)中序遍历二叉排序树并输出排序结果; 2、数据结构设计; 3、主要算法设计; 4、编程及上机实现; 5、撰写课程设计报告,包括: (1)设计题目; (2)摘要和关键字; (3)正文,包括引言、需求分析、数据结构设计、算法设计、程序实现及测试、设计体会等; (4)结束语; (5)参考文献。 时间安排:2007年7月2日-7日(第18周) 7月2日查阅资料 7月3日系统设计,数据结构设计,算法设计 7月4日-5日编程并上机调试7月6日撰写报告 7月7日验收程序,提交设计报告书。 指导教师签名: 2007年7月2日 系主任(或责任教师)签名: 2007年7月2日 排序二叉树的建立及其遍历的实现

摘要:我所设计的课题为排序二叉树的建立及其遍历的实现,它的主要功能是将输入的数据 组合成排序二叉树,并进行,先序,中序和后序遍历。设计该课题采用了C语言程序设计,简洁而方便,它主要运用了建立函数,调用函数,建立递归函数等等方面来进行设计。 关键字:排序二叉树,先序遍历,中序遍历,后序遍历 0.引言 我所设计的题目为排序二叉树的建立及其遍历的实现。排序二叉树或是一棵空树;或是具有以下性质的二叉树:(1)若它的左子树不空,则作子树上所有的结点的值均小于它的根结点的值;(2)若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;(3)它的左,右子树也分别为二叉排序树。对排序二叉树的建立需知道其定义及其通过插入结点来建立排序二叉树,遍历及其输出结果。 该设计根据输入的数据进行建立排序二叉树。对排序二叉树的遍历,其关键是运用递归 调用,这将极大的方便算法设计。 1.需求分析 建立排序二叉树,主要是需要建立节点用来存储输入的数据,需要建立函数用来创造排序二叉树,在函数内,需要进行数据比较决定数据放在左子树还是右子树。在遍历二叉树中,需要建立递归函数进行遍历。 该题目包含两方面的内容,一为排序二叉树的建立;二为排序二叉树的遍历,包括先序遍历,中序遍历和后序遍历。排序二叉树的建立主要运用了循环语句和递归语句进行,对遍历算法运用了递归语句来进行。 2.数据结构设计 本题目主要会用到建立结点,构造指针变量,插入结点函数和建立排序二叉树函数,求深度函数,以及先序遍历函数,中序遍历函数和后序遍历函数,还有一些常用的输入输出语句。对建立的函明确其作用,先理清函数内部的程序以及算法在将其应用到整个程序中,在建立排序二叉树时,主要用到建立节点函数,建立树函数,深度函数,在遍历树是,用到先序遍历函数,中序遍历函数和后序遍历函数。

C语言实现二叉树的前序遍历(递归)

C语言实现二叉树的前序遍历算法实现一: #include #include typedef struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') T=NULL; else { T=(struct BiTNode *)malloc(sizeof(struct BiTNode)); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); } } int print(BiTree T)//前序遍历(输出二叉树) { if(T==NULL)return 0; else if(T->lchild==NULL && T->rchild==NULL)return 1; else return print(T->lchild)+print(T->rchild); } void main()//主函数 { BiTree T; CreateBiTree(T); printf("%d\n",print(T)); } 算法实现二: #include

#include struct BiTNode//定义结构体 { char data; struct BiTNode *lchild,*rchild; }; int num=0; void CreatBiTree(struct BiTNode *&p) //前序创建树 { char ch; scanf("%c",&ch); if(ch==' ') p=NULL; else { p=(struct BiTNode *)malloc(sizeof(struct BiTNode)); p->data=ch; CreatBiTree(p->lchild); CreatBiTree(p->rchild); } } void print(struct BiTNode *p) //前序遍历(输出二叉树){ if(p!=NULL) { if(p->lchild==NULL&&p->rchild==NULL) else { print(p->lchild); print(p->rchild); } } } void main()//主函数 { struct BiTNode *p; CreatBiTree(p); print(p); printf("%d\n",num); } 供测试使用的数据

第6章树和二叉树习题

第六章 树和二叉树 一、选择题 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 )

数据结构C语言实现二叉树三种遍历

实验课题一:将下图中得二叉树用二叉链表表示: 1用三种遍历算法遍历该二叉树,给出对应得输出结果; 2写一个函数对二叉树搜索,若给出一个结点,根据其就是否属于该树,输出true或者f alse。 3写函数完成习题4、31(C++版)或4、28(C版教科书)。 #include "stdio、h" #include”malloc、h" typedefstruct BiTNode { char data; structBiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree Create(BiTreeT) { char ch; ch=getchar(); if(ch=='#’) T=NULL; else { T=(BiTNode *)malloc(sizeof(BiTNode)); T-〉data=ch; T->lchild=Create(T—〉lchild); T—〉rchild=Create(T-〉rchild); } return T; } int node(BiTree T) { int sum1=0,a,b; ?if(T) { if(T!=NULL) ??sum1++;

?a=node(T->lchild); sum1+=a; b=node(T—>rchild); sum1+=b; ?} return sum1; } int mnode(BiTree T) { ?int sum2=0,e,f; if(T) { ?if((T->lchild!=NULL)&&(T-〉rchild!=NULL))?sum2++; ?e=mnode(T-〉lchild); sum2+=e; f=mnode(T-〉rchild); sum2+=f; ?} return sum2; } void Preorder(BiTree T) { if(T) { printf("%c”,T->data); Preorder(T—>lchild); Preorder(T-〉rchild); } } int Sumleaf(BiTree T) { int sum=0,m,n; if(T) { if((!T-〉lchild)&&(!T-〉rchild)) sum++; m=Sumleaf(T->lchild); sum+=m; n=Sumleaf(T—>rchild); sum+=n; } return sum; }

二叉树的遍历(先序、中序、后序)

实践三:树的应用 1.实验目的要求 通过本实验使学生深刻理解二叉树的性质和存储结构,熟练掌握二叉树的遍历算法。认识哈夫曼树、哈夫曼编码的作用和意义。 实验要求:建一个二叉树并按照前序、中序、后序三种方法遍历此二叉树,正确调试本程序。 能够建立一个哈夫曼树,并输出哈夫曼编码,正确调程序。写出实验报告。 2.实验主要内容 2.1 对二叉树进行先序、中序、后序递归遍历,中序非递归遍历。 2.2 根据已知的字符及其权值,建立哈夫曼树,并输出哈夫曼编码。 3.实验步骤 2.1实验步骤 ●输入p127二叉链表的定义 ●录入调试p131算法6.4,实现二叉树的构造函数 ●编写二叉树打印函数,可以通过递归算法将二叉树输出为广义表的 形式,以方便观察树的结构。 ●参考算法6.1,实现二叉树的前序、中序和后序的递归遍历算法。 为简化编程,可以将visit函数直接使用printf函数输出结点内容来 代替。 #include #include #include #define OK 1 #define ERROR 0 #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef char TElemType; typedef char Status; // 构造书的结构体

typedef struct BiTNode{ TElemType data; struct BiTNode *lchild, *rchild; }BiTNode, *BiTree; // 构造栈的结构体 typedef BiTree SElemType; typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; Status InitStack(SqStack &S){ //构造一个空栈 S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType)); if(!S.base)exit(-2); S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; } Status StackEmpty(SqStack S){ //若栈S为空栈,则返回TRUE,否则返回FALSE if(S.top==S.base) return 1; else return 0; }

二叉树的层次遍历算法

二叉树层次遍历算法实现 问题描述 对任意输入的表示某二叉树的字符序列,完成二叉树的层次遍历算法,并输出其遍历结果。 注:所需Queue ADT的实现见附录。 输入描述 从键盘上输入一串字符串,该字符串为二叉树的先序遍历结果,其中如果遍历到空树时用字符”#”代替。 输出描述 从显示器上输出二叉树的按层次遍历结果。 输入与输出示例 输入: +A##/*B##C##D## 输出: +A/*DBC 输入: ABD##GJ###CFH##I### 输出: ABCDGFJHI 附录(仅供参考): #include #include #define TRUE 1 #define FALSE 0 #define MAX_QUEUE_SIZE 100

//注:需要定义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、了解二叉树的建立的方法及其遍历的顺序,熟悉二叉树的三种遍历 2、检验输入的数据是否可以构成一颗二叉树 二、实验的描述和算法 1、实验描述 二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。因为耳熟的每一个左右子树又是一颗二叉树,所以可以用递归的方法来建立其左右子树。二叉树的遍历是一种把二叉树的每一个节点访问完并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句实现。 2、算法 #include #include #define OVERFLOW 0 #define OK 1 #define ERROR 0 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree CreateBiTree(BiTree T)

{ scanf("%c",&e); if(e==' ') T=NULL; else { if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW); T->data=e; T->lchild=CreateBiTree(T->lchild); T->rchild=CreateBiTree(T->rchild); } return T; } /************************前序遍历***********************/ char PreOrderTraverse(BiTree T,char (* Visit)(char e)) { if(T) { if(Visit(T->data)) if(PreOrderTraverse(T->lchild,Visit)) if(PreOrderTraverse(T->rchild,Visit)) return OK; return ERROR; } else return OK; } char Visit(char e) { printf("%5c",e); return OK; } main() {

二叉树的建立及几种简单的遍历方法

#include "stdio.h" #include "stdlib.h" #define STACK_INIT_SIZE 100 //栈存储空间初始分配量 #define STACKINCREMENT 10 //存储空间分配增量 //------二叉树的存储结构表示------// typedef struct BiTNode{ int data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //-----顺序栈的存储结构表示------// typedef struct{ BiTree *top; BiTree *base; int stacksize; }SqStack; //*************************************************** //构造一个空栈s SqStack *InitStack(); //创建一颗二叉树 BiTree CreatBiTree(); //判断栈空 int StackEmpty(SqStack *S); //插入元素e为新的栈顶元素 void Push(SqStack *S,BiTree p); //若栈不为空,则删除s栈顶的元素e,将e插入到链表L中void Pop(SqStack *S,BiTree *q); //非递归先序遍历二叉树 void PreOrderTraverse(BiTree L); //非递归中序遍历二叉树 void InOrderTraverse(BiTree L); //非递归后序遍历二叉树 void PostOrderTraverse(BiTree L); //递归后序遍历二叉树 void PostOrder(BiTree bt); //递归中序遍历二叉树 void InOrder(BiTree bt); //递归先序遍历二叉树 void PreOrder(BiTree bt); //***************************************************

遍历二叉树老师的程序(绝对正确,实现先序、中序、后序遍历)

#include #include"stdlib.h" //节点结构体 typedef struct BiTNode { char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //***********先序建立二叉树中的节点****************** void CreatBiTree(BiTree *T) //指针的指针 { char ch; if((ch=getchar())==' ') *T=NULL; else { (*T)=(BiTNode *)malloc(sizeof(BiTNode)); if(!(*T)) exit(1); (*T)->data=ch; CreatBiTree(&((*T)->lchild)); CreatBiTree(&((*T)->rchild)); } } //***************先序遍历二叉树********************** void PreTravel(BiTree T) { if(T) { printf("%c",T->data); PreTravel(T->lchild); PreTravel(T->rchild); } } //*************中序遍历****************** void InOrderTravel(BiTree T) { if(T) { InOrderTravel(T->lchild); printf("%c",T->data); InOrderTravel(T->rchild); }

输入某棵二叉树的广义表形式,建立该二叉树并按层次遍历该二叉树队列形式

掌握二叉树的二叉链表存储结构;掌握二叉树的遍历规则;利用二叉树的二叉链表存储结构实现二叉树的建树操作;利用二叉树的二叉链表存储结构实现二叉树层次遍历操作 二叉树采用二叉链表结构表示。设计并实现如下算法:输入某棵二叉树的广义表形式,建立该二叉树,并按层次遍历该二叉树----队列形式 #include #include #include #define STACK_MAX_SIZE 30 #define QUEUE_MAX_SIZE 30 typedef struct BitNode{ char data; struct BitNode *lchild; struct BitNode *rchild; }BitNode,*BiTree;; typedef struct node { BitNode *data; }node,*queue; typedef struct Queue { node *base; int front; int rear; }Queue; void InitQueue(Queue *Q) { Q->base=(queue)malloc(QUEUE_MAX_SIZE*sizeof(node)); Q->front=Q->rear=0; }

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++;

二叉树的建立和遍历的实验报告doc

二叉树的建立和遍历的实验报告 篇一:二叉树的建立及遍历实验报告 实验三:二叉树的建立及遍历 【实验目的】 (1)掌握利用先序序列建立二叉树的二叉链表的过程。 (2)掌握二叉树的先序、中序和后序遍历算法。 【实验内容】 1. 编写程序,实现二叉树的建立,并实现先序、中序和后序遍历。 如:输入先序序列abc###de###,则建立如下图所示的二叉树。 并显示其先序序列为:abcde 中序序列为:cbaed 后序序列为:cbeda 【实验步骤】 1.打开VC++。 2.建立工程:点File->New,选Project标签,在列表中选Win32 Console Application,再在右边的框里为工程起好名字,选好路径,点OK->finish。至此工程建立完毕。 3.创建源文件或头文件:点File->New,选File标签,在列表里选C++ Source File。给文件起好名字,选好路径,点OK。至此一个源文件就被添加到了你刚创建的工程之中。

4.写好代码 5.编译->链接->调试 #include #include #define OK 1 #define OVERFLOW -2 typedef int Status; typedef char TElemType; typedef struct BiTNode { TElemType data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; Status CreateBiTree(BiTree &T) { TElemType ch; scanf("%c",&ch); if (ch=='#') T= NULL; else { if (!(T = (BiTNode *)malloc(sizeof(BiTNode))))

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

数据结构课程设计--按层次遍历二叉树学号: 题目按层次遍历二叉树学院计算机科学与技术专业计算机科学与技术 班级 姓名 指导教师 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);

用C语言编写二叉树的建立与遍历

用C语言编写二叉树的建立与遍历 #include "stdio.h" #include "string.h" #define NULL 0 typedef struct BiTNode{ char data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; BiTree Create(BiTree T){ char ch; ch=getchar(); if(ch=='#') T=NULL; else{ if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) printf("Error!"); T->data=ch; T->lchild=Create(T->lchild); T->rchild=Create(T->rchild); } return T;

} void Preorder(BiTree T){ if(T){ printf("%c",T->data); Preorder(T->lchild); Preorder(T->rchild); } } int Sumleaf(BiTree T){ int sum=0,m,n; if(T){ if((!T->lchild)&&(!T->rchild)) sum++; m=Sumleaf(T->lchild); sum+=m; n=Sumleaf(T->rchild); sum+=n; } return sum; } void zhongxu(BiTree T){ if(T){

zhongxu(T->lchild); printf("%c",T->data); zhongxu(T->rchild); } } void houxu(BiTree T){ if(T){ houxu(T->lchild); houxu(T->rchild); printf("%c",T->data); } } int Depth(BiTree T){ int dep=0,depl,depr; if(!T) dep=0; else{ depl=Depth(T->lchild); depr=Depth(T->rchild); dep=1+(depl>depr?depl:depr); } return dep; }

二叉树三种遍历算法代码_

二叉树三种遍历算法的源码 二叉树三种遍历算法的源码背诵版 本文给出二叉树先序、中序、后序三种遍历的非递归算法,此三个算法可视为标准算法,直接用于考研答题。 1.先序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize]; int top; }SqStack; void PreOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { visite(p->data); push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) //通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s); p=p->rchild; }//endif }//endwhile }//PreOrderUnrec 2.中序遍历非递归算法 #define maxsize 100 typedef struct { Bitree Elem[maxsize];

int top; }SqStack; void InOrderUnrec(Bitree t) { SqStack s; StackInit(s); p=t; while (p!=null || !StackEmpty(s)) { while (p!=null) //遍历左子树 { push(s,p); p=p->lchild; }//endwhile if (!StackEmpty(s)) { p=pop(s); visite(p->data); //访问根结点 p=p->rchild; //通过下一次循环实现右子树遍历}//endif }//endwhile }//InOrderUnrec 3.后序遍历非递归算法 #define maxsize 100 typedef enum{L,R} tagtype; typedef struct { Bitree ptr; tagtype tag; }stacknode; typedef struct { stacknode Elem[maxsize]; int top; }SqStack; void PostOrderUnrec(Bitree t)

二叉树前序、中序、后序遍历相互求法

二叉树前序、中序、后序遍历相互求法今天来总结下二叉树前序、中序、后序遍历相互求法,即如果知道两个的遍历,如何求第三种遍历方法,比较笨的方法是画出来二叉树,然后根据各种遍历不同的特性来求,也可以编程求出,下面我们分别说明。 首先,我们看看前序、中序、后序遍历的特性: 前序遍历: 1.访问根节点 2.前序遍历左子树 3.前序遍历右子树 中序遍历: 1.中序遍历左子树 2.访问根节点 3.中序遍历右子树 后序遍历: 1.后序遍历左子树 2.后序遍历右子树 3.访问根节点 一、已知前序、中序遍历,求后序遍历 例: 前序遍历: GDAFEMHZ 中序遍历: ADEFGHMZ 画树求法: 第一步,根据前序遍历的特点,我们知道根结点为G 第二步,观察中序遍历ADEFGHMZ。其中root节点G左侧的ADEF必然是root的左子树,G右侧的HMZ必然是root的右子树。 第三步,观察左子树ADEF,左子树的中的根节点必然是大树的root的leftchild。在前序遍历中,大树的root的leftchild位于root之后,所以左子树的根节点为D。 第四步,同样的道理,root的右子树节点HMZ中的根节点也可以通过前序遍历求得。在前序遍历中,一定是先把root和root的所有左子树节点遍历完之后才会遍历右子树,并且遍历的左子树的第一个节点就是左子树的根节点。同理,遍历的右子树的第一个节点就是右子树的根节点。 第五步,观察发现,上面的过程是递归的。先找到当前树的根节点,然后划分为左子树,右子树,然后进入左子树重复上面的过程,然后进入右子树重复上面的过程。最后就可以还原一棵树了。该步递归的过程可以简洁表达如下: 1 确定根,确定左子树,确定右子树。 2 在左子树中递归。

相关主题
文本预览
相关文档 最新文档