二叉树的随机生成及其遍历

合集下载

二叉树的遍历和应用

二叉树的遍历和应用

内蒙古科技大学本科生课程设计说明书题目:数据结构课程设计——二叉树的遍历和应用学生姓名:学号:专业:班级:指导教师: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)致谢 ···········································································································错误!未定义书签。

二叉树的性质及其遍历

二叉树的性质及其遍历
12.2 二叉树的遍历 12.3 二叉树的存储结构
12.3.1 顺序存储结构 12.3.2 链式存储
•二叉树的性质及其遍历
12.1 二叉树的基本性质
定理 1:满二叉树第i层上恰好有2i-1个结点 (i≥1).
证:使用归纳法。i=1时,结论显然成立。设i=k时结 论成立,则考虑i=k+1的情形。由于(k+1)层上结点 是k层上结点的儿子,而且满二叉树每个非叶子结 点恰好有两个儿子,故(k+1)层上结点个数为k层上 结点个数的2倍,即2·2k-1 = 2k = 2(k+1)-1. 这表明, i=k+1时结论也成立。由归纳法原理,结论对任意 的k都成立,证毕。
x的相对地址x的编号x的父亲/儿子的编 号(性质7) x的父亲/儿子的相对地址。
•二叉树的性质及其遍历
至于结点的相对地址与编号之间的换算,有下列关系: 结点相对地址 = (结点编号 – 1)×每个结点所
占单元数目
a
b
f
cegh d
1 2 34 56 7 8 a b f ce g h d …
图 12-2 顺序二叉树的顺序存储
•二叉树的性质及其遍历
12.1.7 定理7 若对一棵有n个结点的顺序二叉树的结点按层序 编号,则对任一结点i(1≤i≤n),有(1)若i=1, 则结点i是根, 无父亲;若i〉1,则其父亲是结点i/2。(2)若2i>n,则结点i 无左儿子(从而也无右儿子,为叶子);否则i的左儿子是结 点2i。(3)若2i+1>n,则结点i无右儿子;否则右儿子是结点 2i+1。
12.3.1顺序存储结构
(一) 顺序二叉树的顺序存储结构
这种存储结构是按结点的层序编号的次序,将 结点存储在一片连续存储区域内。由定理 7知, 对顺序二叉树,若已知结点的层序编号,则可推 算出它的父亲和儿子的编号,所以,在这种存储 结构中,很容易根据结点的相对地址计算出它的 父亲和儿子的相对地址,方法是:

二叉树的遍历实验报告

二叉树的遍历实验报告

二叉树的遍历实验报告二叉树的遍历实验报告引言:二叉树是一种常见的数据结构,它由节点和连接节点的边组成。

在实际应用中,我们经常需要对二叉树进行遍历,以便对其中的节点进行访问和操作。

本次实验旨在探索二叉树的遍历算法,并通过实验验证其正确性和效率。

一、二叉树的定义和基本操作二叉树是一种特殊的树结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。

根据节点的访问顺序,二叉树的遍历可以分为前序遍历、中序遍历和后序遍历三种方式。

前序遍历是指先访问根节点,然后按照左子树、右子树的顺序递归地进行遍历;中序遍历是指先按照左子树、根节点、右子树的顺序递归地进行遍历;后序遍历是指先按照左子树、右子树、根节点的顺序递归地进行遍历。

二、实验设计和方法为了验证二叉树的遍历算法的正确性和效率,我们设计了以下实验方案:1. 构建二叉树:我们首先构建一个具有一定规模的二叉树,以模拟实际应用中的情况。

为了方便起见,我们选择随机生成一棵二叉树,并确保其结构合理。

2. 实现遍历算法:我们根据前文所述的遍历方式,实现了相应的遍历算法。

在实现过程中,我们考虑到了递归和迭代两种方式,并分别进行了实验比较。

3. 遍历实验:我们使用不同规模的二叉树进行遍历实验,并记录遍历的结果和所花费的时间。

通过对比不同规模下不同遍历方式的结果和时间,我们可以评估遍历算法的效率和准确性。

三、实验结果和分析在实验中,我们构建了一棵具有1000个节点的二叉树,并分别使用前序、中序和后序遍历算法进行遍历。

通过实验结果的比较,我们得出以下结论:1. 遍历结果的正确性:无论是前序、中序还是后序遍历,我们都能够正确地访问到二叉树中的每个节点。

这表明我们所实现的遍历算法是正确的。

2. 遍历算法的效率:在1000个节点的二叉树中,我们发现中序遍历算法的执行时间最短,后序遍历算法的执行时间最长,前序遍历算法的执行时间居中。

这是因为中序遍历算法在访问节点时可以尽可能地减少递归次数,而后序遍历算法需要递归到最深层才能返回。

二叉树的随机生成及其遍历

二叉树的随机生成及其遍历

叉树的随机生成及其遍历张 zhaohan 10804XXXXX2010/6/12问题重述利用随机函数产生50个(不大于1 00且各不相同的)随机整数,用这些整数来生成一棵二叉树,分别对二叉树进行先根遍历,中根遍历和后根遍历并输出树中结点元素序列。

程序设计(一) 需求分析:•问题的定义与要求: 1 、产生50个不大于100且各不相同的随机整数 (由系统的随机函数生成并对100取模);2、先根遍历并输出结果;3、中根遍历并输出结果;4、后根遍历并输出结果;按层次浏览二叉树结5、点;6、退出程序。

•俞入:所需功能,选项为1〜6。

•输出:按照用户功能选择输出结果。

•限制:输入的功能选择在1〜6之间,否则无回应。

•模块功能及要求:RandDif(): 生成50个随机不大于100的整数,每次生成不同随机整数。

CreateBitree(): 给数据结点生成二叉树,使每个结点的左右儿子指针指向左右儿子。

NRPreOrder(): 非递归算法的先根遍历。

inOrderTraverse(): 递归算法的中根遍历。

P ostOrderTraverseO:递归算法的后根遍历。

Welcome(): 欢迎窗口。

Menu():菜单。

Goodbye():再见窗口。

(二) 概要设计:首先要生成二叉树,由于是对随机生成的50个数生成二叉树,故可以采取顺序存储的方式,对结点的左右儿子进行赋值。

生成的二叉树是完全二叉树。

先根遍历的非递归算法:1、根结点进栈2、结点出栈,被访问3、结点的右、左儿子(非空)进栈4、反复执行2、3 ,至栈空为止。

先根遍历的算法流程图:根结点进栈( a[0]=T->boot,p=a[0] ) 访问结点printf(*p)右儿子存在则进栈a[i]=(*p).rchild; i++;左儿子存在则进栈a[i]=(*p).rchild; i++;栈顶降低top--:i--;p=a[i];栈非空while(i>-1)返回中根遍历的递归算法流程图:T为空Return;inOrderTraverse(T->lchild)Printf(T->data) inOrderTraverse(T->rchild)返回后根遍历的递归算法流程图:T为空Return;inOrderTraverse(T->lchild) inOrderTraverse(T->rchild)Printf(T->data)返回遍历输出均按链式存储。

《离散数学》课件-第16章树

《离散数学》课件-第16章树
解:易见所求为该图的一棵最小生成树,如图所示 总造价为57
18
16.3 根树及其应用
19
定义(有向树)设D是有向图,如果D的基图是无向 树,则称D为有向树。
在有向树中最重要的是根树。 定义16.6(根树)一棵非平凡的有向树,如果恰有 一个顶点的入度为O,其余所有顶点的入度均为1,则称该 树为根树。 入度为0的顶点称为树根,入度为1出度为0的顶点称 为树叶,入度为1出度不为0的点称为内点,内点和树根统 称为分支点。 树根到一个顶点的有向通路的长度称为该顶点的层数。 层数最大顶点的层数称为树高。 平凡树也称为根树。
2
16.1 树及其性质
3
定义16.1(树和森林) 连通且无回路的无向图称为无向树,简称为树,常用
T表示树。 平凡图为树,称为平凡树。 非连通且每个连通分支是树的无向图称为森林。 T中度数为1的顶点(悬挂顶点)称为树叶,度数大于
1的顶点称为分支点。 称只有一个分支点,且分支点的度数为n-1的n(n≥3)
定义16.8(子树)设T为一棵根树,则其任一顶点v 及其后代导若将层数相同的顶点都 标定次序,则称T为有序树。
根据每个分支点的儿子数以及是否有序,可将根树 分成如下若干类:
定义(跟树分类)设T为一棵根树 (1)若T的每个分支点至多有r个儿子,则称T为r叉 树。又若r叉树是有序的,则称它为r叉有序树。 (2)若T的每个分支点恰好有r个儿子,则称T为r叉 正则树。又若r叉正则树是有序的,则称它为r叉正则有 序树。 (3)若T为r叉正则树,且每个树叶的层数均为树高, 则称T为r叉完全正则树。又若r叉完全正则树是有序的, 则称它为r叉完全正则有序树。
8
平均编码长度为:L = ∑ P( i )× l( i ) = 2.53bit i=1

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年

数据结构(Java版)_郑州大学中国大学mooc课后章节答案期末考试题库2023年1.对不含相同元素的同一输入序列进行两组不同的、合法的入栈和出栈组合操作,所得的输出序列一定相同。

参考答案:错误2.在链队列中,即使不设置尾指针,也能进行入队操作。

参考答案:正确3.循环顺序队列和循环链队列都存在空间一处问题。

参考答案:错误4.直接选择排序的时间复杂度与关键字的初始排列无关。

参考答案:正确5.一个循环链表可以由给定的头指针或尾指针来唯一标识。

参考答案:正确6.所谓随机存取,就是通过首地址和元素的序号可以在O(1)的时间内找到指定的元素。

参考答案:正确7.快速排序在最坏情况下的时间复杂度是O(【图片】)。

参考答案:正确8.哈夫曼树是带权路径长度最短的树,路径上权值较大的结点离根较近()参考答案:正确9.在队列中存取数据元素的原则是()。

参考答案:先进先出10.将整数1、2、3、4依次进栈,则不可能得到的出栈序列是()。

参考答案:142311.完全二叉树的存储结构通常采用顺序存储结构()。

参考答案:正确12.在中序线索二叉树中,每一非空的线索均指向其祖先结点()参考答案:正确13.二叉树中序线索化后,不存在空指针域()参考答案:错误14.二叉树的层次遍历需要栈结构的支持。

参考答案:错误15.下列关于AOE网的叙述中,不正确的是()参考答案:任何一个关键活动提前完成,那么整个工程将会提前完成16.一棵非空的二叉树的先序遍历序列与后序遍历序列正好相反,则该二叉树一定满足()参考答案:只有一个叶子结点17.引入二叉线索树的目的是()参考答案:加快查找结点的前驱或后继的速度18.单源最短路径算法的时间复杂度为()参考答案:O()19.对6个不同的数据元素进行直接插入排序,最多需要进行()次关键字的比较。

参考答案:1520.完全二叉树中,若一个结点没有左孩子,则它必是树叶()。

参考答案:正确21.已知循环队列存储在一维数组A[0【图片】n]中,且队列非空时front和rear分别指向队首元素和队尾元素。

①西北工业大学《801计算机专业基础》考试大纲(2021年官方版)

①西北工业大学《801计算机专业基础》考试大纲(2021年官方版)

题号:801《计算机专业基础》考试大纲注:以下五部分内容只选择两部分进行答题(一)、计算机组成原理(75分)一、考查目标1.深入理解单处理器计算机系统的组织结构、工作原理、互连结构,具有完整的计算机系统整机的概念;2.掌握各部件的组成结构、工作原理、软硬件设计的舍取、以及硬件实现;3.综合运用计算机组成的基本原理和基本方法,对有关计算机硬件系统中的理论和实际问题进行计算、分析,并能对一些基本部件进行逻辑设计。

二、考试内容1.总线:总线的组成、分类、特性和性能指标,总线的层次结构,总线定时、传送、仲裁。

2.内存储器:存储器的基本概念、分类、层次结构,半导体主存储器,高速缓冲存储器(Cache),差错检测。

3.输入/输出:I/O编制的方法,编程I/O、程序中断、DMA的原理及控制机制。

4.运算方法与运算器:计算机中的数制系统,数的表示方法,定点数四则运算方法,浮点数四则运算方法,定点加减法器设计。

5.指令系统:指令格式、数据类型、寻址方式、指令类型、指令系统设计与优化。

6.处理器技术:CPU的结构、CPU中的寄存器组织、控制器的结构和工作原理、微程序设计技术。

三、参考书目1.唐朔飞编著.计算机组成原理(第二版).高等教育出版社,20082.白中英主编.计算机组成原理(第四版).科学出版社,20093.蒋本珊编著.计算机组成原理(第二版).清华大学出版社,2008(二)、数据结构(75分)考查目标1.理解数据结构的基本概念;掌握数据的逻辑结构、存储结构及其差异,以及各种基本操作的实现。

2.掌握基本的数据处理原理和方法,在此基础上能够对算法进行设计与分析。

3.能够选择合适的数据结构和方法进行问题求解。

考查内容一、线性表(一)线性表的定义和基本操作(二)线性表的实现1.顺序存储结构2.链式存储结构3.线性表的应用二、栈、队列和数组(一)栈和队列的基本概念(二)栈和队列的顺序存储结构(三)栈和队列的链式存储结构(四)栈和队列的应用(五)特殊矩阵的压缩存储三、树与二叉树(一)树的概念(二)二叉树1.二叉树的定义及其主要特征2.二叉树的顺序存储结构和链式存储结构3.二叉树的遍历4.线索二叉树的基本概念和构造5.二叉排序树6.平衡二叉树(三)树、森林1.树的存储结构2.森林与二叉树的转换3.树和森林的遍历(四)树的应用1.等价类问题2.哈夫曼树和哈夫曼编码四、图(一)图的概念(二)图的存储及基本操作1.邻接矩阵法2.邻接表法(三)图的遍历1.深度优先搜索2.广度优先搜索(四)图的基本应用及其复杂度分析1.最小(代价)生成树2.最短路径3.拓扑排序4.关键路径五、查找(一)查找的基本概念(二)顺序查找法(三)折半查找法(四)B-树(五)散列(Hash)表及其查找(六)查找算法的分析及应用六、内部排序(一)排序的基本概念(二)插入排序1.直接插入排序2.折半插入排序3.希尔(shell)排序(三)交换排序1.冒泡排序2.快速排序(四)选择排序1.简单选择排序2.堆排序(五)归并排序1.二路归并排序(六)基数排序(七)各种内部排序算法的比较(八)内部排序算法的应用参考书从考试大纲看,所要求的知识在一般的大学数据结构教材中都已经包含,所以,选择哪本书并不是重要的事情。

一种基于Logistic混沌序列的二叉树遍历置乱方法

一种基于Logistic混沌序列的二叉树遍历置乱方法
来控制对数字图像的随机分块。分块情形如下 : 图1 给出了在由 L g t 混沌序列生成的密钥 o ii sc 的控制下 , 对图像随机的进行不 同方式的分块。其 中() ( ) a 、b 分别是按列、 按行划分 ,c 为按行列划 ()
案的安全性必须仅仅依赖于密钥 K的保密性 , 而不 依赖于算法的保密性 , 因此文[ ] 6给出的二 叉树遍历 的置乱方法不满足柯克霍夫 ( echf ) K r o s定理 的要 k f 求, 一旦置乱算法泄露 , 置乱 图像将很容易被恢 复。
I l 3 6 1 2 7



l O
l 1
1 2
l 3 5 - 4 6 2 l 9 0l l 7 l l 2 8

1 3
l 48
l 9
测试 , 对置乱后的 图像进行剪切 、 噪等处理 , 加 实验结果表明本算法具有较好 的密钥敏感性 以 一定的鲁棒性 。 及
关键词 : oi i混沌序列 ; Lg t sc 二叉树遍 历 ; 置乱
中图分 类号 : ] 0 TP 9 3 文献标识码 : A 文章编号 :0 7—3 6 {0 0 0 — 19 4 10 2 4 2 1 ) 1 0 1 一O
21 0 0年 1月 第1 5卷 第 1 期
西





学 报
Jn 2 1 a . 00 V 11 o 1 o.5N .
J UR ALO ’ N NI E ST O O T ND T L () O N FXIA U V R I Y F P S SA E E XMMUNIA ON C TI S
作者简介 : 王锦涛 (94 , , 18 一)男 陕西户县人 , 西安邮电学院信息安全研究 中心硕士研究生 ; 田东平 (95 , , 15 一)男 安徽泗县人 , 邮电学 院信息安全研究 中心教授 , 西安 博士生导师。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

二叉树的随机生成及其遍历张zhaohan 10804XXXXX2010/6/12问题重述利用随机函数产生50个(不大于100且各不相同的)随机整数,用这些整数来生成一棵二叉树,分别对二叉树进行先根遍历,中根遍历和后根遍历并输出树中结点元素序列。

程序设计(一)需求分析:●问题的定义与要求:1、产生50个不大于100且各不相同的随机整数(由系统的随机函数生成并对100取模);2、先根遍历并输出结果;3、中根遍历并输出结果;4、后根遍历并输出结果;5、按层次浏览二叉树结点;6、退出程序。

●输入:所需功能,选项为1~6。

●输出:按照用户功能选择输出结果。

●限制:输入的功能选择在1~6之间,否则无回应。

●模块功能及要求:RandDif():生成50个随机不大于100的整数,每次生成不同随机整数。

CreateBitree():给数据结点生成二叉树,使每个结点的左右儿子指针指向左右儿子。

NRPreOrder():非递归算法的先根遍历。

inOrderTraverse():递归算法的中根遍历。

PostOrderTraverse():递归算法的后根遍历。

Welcome():欢迎窗口。

Menu():菜单。

Goodbye():再见窗口。

(二)概要设计:首先要生成二叉树,由于是对随机生成的50个数生成二叉树,故可以采取顺序存储的方式,对结点的左右儿子进行赋值。

生成的二叉树是完全二叉树。

先根遍历的非递归算法:1、根结点进栈2、结点出栈,被访问3、结点的右、左儿子(非空)进栈4、反复执行2、3 ,至栈空为止。

先根遍历的算法流程图:根结点进栈(a[0]=T->boot,p=a[0])访问结点printf(*p)右儿子存在则进栈a[i]=(*p).rchild; i++;左儿子存在则进栈a[i]=(*p).rchild; i++;栈顶降低top--:i--;p=a[i];栈非空while(i>-1)返回中根遍历的递归算法流程图:T为空YNReturn;inOrderTraverse(T->lchild)Printf(T->data)inOrderTraverse(T->rchild)返回后根遍历的递归算法流程图:T为空YNReturn;inOrderTraverse(T->lchild)inOrderTraverse(T->rchild)Printf(T->data)返回遍历输出均按链式存储。

链式存储的特点是借助指示元素存储地址的指针(pointer)表示数组元素之间的逻辑关系。

按层次查看二叉树元素则按下标顺序直接输出。

同时,生成随机数、生成二叉树均是按顺序存储。

顺序存储的特点是借助元素在存储器中的相对位置来表示数据元素之间的逻辑关系。

(三)详细设计程序源代码设计:(1)定义结点:struct data{int n;struct data *lchild;struct data *rchild;}data[N];(2)产生随机数RandDif(struct data data[])int i,j;srand((int)time(0));for(i=0;i<N;i++){data[i].n=rand()%100;for(j=i-1;j>1;j--)if(data[i].n==data[j].n||data[i].n==0){i--;j=0;} }}(3)生成二叉树CreateBitree(struct data data[])int i;for(i=0;i<25;i++)data[i].lchild=&data[2*i+1];data[i].rchild=&data[2*i+2];}printf("\nSuccessfully create a Binary Tree.\n");printf("The Binary Tree has 50 different element.");}(4)先根遍历的非递归算法NRPreOrder(struct data data[])int i=0;struct data *a[N],*p=&data[0];while(i>-1){printf("%-4d",(*p).n);if((*(*p).rchild).n)a[i]=(*p).rchild;i++;}if((*(*p).lchild).n)a[i]=(*p).lchild;i++;}i--;p=a[i];/ }}(5)先根遍历的递归算法PreOrderTraverse(struct data data) if(data.n){printf("%-4d",data.n);PreOrderTraverse(*(data.lchild));PreOrderTraverse(*(data.rchild));}}(6)中根遍历的递归算法inOrderTraverse(struct data data) {if(data.n){inOrderTraverse(*(data.lchild));printf("%-4d",data.n);inOrderTraverse(*(data.rchild));}}(7)后根遍历的递归算法PostOrderTraverse(struct data data)if(data.n){PostOrderTraverse(*(data.lchild));PostOrderTraverse(*(data.rchild));printf("%-4d",data.n);}}(四)测试结果:由于先、中、后根遍历递归算法类似,故此处,选择中根遍历递归算法进行测试:如某次生成的50个数为:28 96 97 60 43 65 90 70 11 91 6 4 37 44 94 81 56 63 14 28 73 67 64 13 45 75 88 57 77 86 55 69 23 98 31 85 8 12 87 9 51 93 3 40 18 17 72 21 10 58而生成的二叉树为:2896 9760 43 65 9070 11 91 6 4 37 44 9481 56 63 14 28 73 67 64 13 45 75 88 57 77 86 5569 23 98 31 85 8 12 87 9 51 93 3 40 18 17 72 21 10 58图:二叉树中根遍历结果为:69 81 23 70 98 56 31 60 85 63 8 11 12 14 87 96 9 28 51 91 93 73 3 43 40 67 18 6 17 64 72 28 21 13 10 4 58 45 65 75 37 88 97 57 44 77 90 86 94 55而程序中根遍历结果为:69 81 23 70 98 56 31 60 85 63 8 11 12 14 87 96 9 28 51 91 93 73 3 43 40 67 18 6 17 64 72 28 21 13 10 4 58 45 65 75 37 88 97 57 44 77 90 86 94 55完全符合,递归算法测试完毕。

验证先根遍历的非归算法:在main()中加入先根递归算法和非递归算法作结果比较。

由于递归算法已经验证,故此处只须非递归算法和递归算法结果符合即可。

生成50个数:1 12 38 79 72 86 13 4 11 7 58 75 88 6 3 82 50 57 61 91 92 14 28 68 46 99 30 25 20 24 85 63 5 39 9 49 60 31 90 96 76 36 98 83 27 84 22 56 21 87递归算法的先根遍历结果:1 12 79 4 82 63 5 50 39 9 11 57 49 60 64 31 90 72 7 91 96 76 92 36 98 58 14 83 27 28 84 22 38 86 75 68 56 21 46 87 88 99 30 13 6 25 20 3 24 85非递归算法的先根遍历结果:1 12 79 4 82 63 5 50 39 9 11 57 49 60 64 31 90 72 7 91 96 76 92 36 98 58 14 83 27 28 84 22 38 86 75 68 56 21 46 87 88 99 30 13 6 25 20 3 24 85在生成50个随机不同整数的过程中遇到了几次问题,如循环条件差一个数,就会导致生成数中有几个数是相同的,此时就需要修改循环条件;数据要排除0。

函数的参数传递存在一定误区,有几次传递参数不当,格式不符,导致不能得到结果,在认清了函数参数传递的要求后问题得以解决。

调试的时候为发现各个细节问题,会在各个模块的容易出问题的过程加输出函数,就便于发现问题所在。

易知生成随机数的时间复杂度为,生成二叉树的时间复杂度为O(n),递归遍历的时间复杂度均为O(n),而非递归先根遍历的时间复杂度也为O(n)。

附:完整程序代码:/*利用随机函数产生50个(不大于100且各不相同的)随机整数,用这些整数来生成一棵二树,分别对二叉树进行先根遍历,中根遍历和后根列遍历输出树中结点元素序列。

先根遍历输出要求采用非递归来实现。

#include<stdio.h>#include<stdlib.h>#include<time.h>#include<conio.h>#define N 50#define NULL 0struct data{int n;struct data *lchild;struct data *rchild;}data[N];/*定义数组元素*/void RandDif(struct data data[]){/*生成个互不相同的随机整数*/int i,j;srand((int)time(0));/*每次生成不同的随机数*/for(i=0;i<N;i++){data[i].n=rand()%100;for(j=i-1;j>-1;j--)if(data[i].n==data[j].n||data[i].n==0){i--;j=0;} }}void CreateBitree(struct data data[]){/*生成二树*/int i;for(i=0;i<25;i++){/*将结点的左右儿子指针指向相应的左右儿子*/data[i].lchild=&data[2*i+1];data[i].rchild=&data[2*i+2];}printf("\nSuccessfully create a Binary Tree.\n");printf("The Binary Tree has 50 different element.");}void NRPreOrder(struct data data[]){/*先根遍历输出,非递归算法*/int i=0;struct data *a[N],*p=&data[0];while(i>-1){printf("%-4d",(*p).n);if((*(*p).rchild).n){/*存在右儿子,则右儿子进栈*/a[i]=(*p).rchild;i++;}if((*(*p).lchild).n){/*存在右儿子,则左儿子进栈*/a[i]=(*p).lchild;i++;}i--;p=a[i];/*出栈,栈顶指针下移*/}}void PreOrderTraverse(struct data data){/*先根遍历输出,递归算法*/if(data.n){printf("%-4d",data.n);PreOrderTraverse(*(data.lchild));/*先根遍历右子树*/PreOrderTraverse(*(data.rchild));/*先根遍历左子树*/}}void inOrderTraverse(struct data data){/*中跟遍历输出,递归算法*/if(data.n){inOrderTraverse(*(data.lchild));/*中跟遍历左子树*/printf("%-4d",data.n);inOrderTraverse(*(data.rchild));/*中跟遍历右子树*/}}void PostOrderTraverse(struct data data){/*后根遍历输出,递归算法*/if(data.n){PostOrderTraverse(*(data.lchild));/*后根遍历左子树*/PostOrderTraverse(*(data.rchild));/*后根遍历右子树*/printf("%-4d",data.n);}}void Welcome(){/*欢迎窗口*/printf("\n\n Welcome use Traverse Binary Tree\n\n");printf("\n\n\n\n");printf("\n");printf(" Specialty:Information and Computational Science Program\n"); printf(" Class:2 Grade:2 No.:200530760214 Name:Lin Weiyang\n"); printf(" Press any key to continue...\n");getch();}void Menu(){/*菜单*/printf(" ***************************************************************\n"); printf(" ** Please select the function you need: **\n"); printf(" ** 1.Create another tree. **\n"); printf(" ** 2.Preorder traverse the Binary Tree. **\n"); printf(" ** 3.Inorder traverse the Binary Tree. **\n"); printf(" ** 4.Postorder traverse the Binary Tree. **\n"); printf(" ** 5.Display the Binary Tree. **\n"); printf(" ** 6.Exit. **\n"); printf(" ***************************************************************\n"); }void Goodbye(){/*再见窗口*/printf("\n");printf("\n");printf(" TTTTTT TT TT TT TT TT TT TT TTTT \n");printf(" TT TT TT TTTT TT TT TT TT TT TT \n");printf(" TT TT TT TT TT TTT TT TT TT TT \n");printf(" TT TT TT TT TT TTTT TT TT TT TT \n");printf(" TT TTTTTT TT TT TT TTTT TTTT TT \n");printf(" TT TT TT TTTTTT TT TTT TT TT TT \n");printf(" TT TT TT TT TT TT TT TT TT TT \n");printf(" TT TT TT TT TT TT TT TT TT TT TT \n");printf(" TT TT TT TT TT TT TT TT TT TTTT \n");printf("\n");printf("\n");printf(" Copyright 2010 ZhangZhaohan\n");printf(" Press any key to exit...\n");getch();}void main(){int i;Welcome();Loop:clrscr();Menu();switch(getch()){case'1':RandDif(data);CreateBitree(data);printf("\n\nPress any key to continue...\n"); getch();goto Loop;break;case'2':printf("The Preorder traverse of the Binary Tree is:\n");NRPreOrder(data);printf("\n\nPress any key to continue...\n");getch();goto Loop;break;case'3':printf("The Inorder traverse of the Binary Tree is:\n");inOrderTraverse(data[0]);printf("\n\nPress any key to continue...\n");getch();goto Loop;break;case'4':printf("The Postorder traverse of the Binary Tree is:\n");PostOrderTraverse(data[0]);printf("\n\nPress any key to continue...\n");getch();goto Loop;break;case'5':printf("The element of the Binary Tree are:\n");for(i=0;i<50;i++)printf("%-4d",data[i].n);printf("\n\nPress any key to continue...\n"); getch();goto Loop;break;case'6':;break;default:goto Loop;}clrscr();Goodbye();}可执行文件:程序运行截图:运行窗口:先根遍历。

相关文档
最新文档