二叉树遍历算法的实现

合集下载

二叉树的遍历实验报告

二叉树的遍历实验报告

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

实现二叉树的各种遍历算法实验报告

实现二叉树的各种遍历算法实验报告
a[i] = 0; int k = 0; search(b,a,k); for(i = 0;i < maxx; ++i)
if(a[i]>kmax) kmax = a[i]; return kmax; } /** 求二叉树的节点个数 **/ int Nodes(BTNode *b) { if(b==NULL)
2.2:( 1 )实现二叉树的先序遍历 ( 2)实现二叉树的中序遍历 ( 3)实现二叉树的后序遍历
三 实验内容 :
3.1 树的抽象数据类型 : ADT Tree{
.专业 .整理 .
下载可编辑
数据对象 D: D 是具有相同特性的数据元素的集合 。 数据关系 R: 若 D 为空集 , 则称为空树 ;
若 D 仅含有一个数据元素 ,则 R 为空集 , 否则 R={H} , H 是如 下二元关系 :
if(b!=NULL) {
printf("%c",b->data); if(b->lchild!=NULL || b->rchild!=NULL) {
printf(" ("); DispBTNode(b->lchild); if(b->rchild != NULL)printf(" , "); DispBTNode(b->rchild); printf(" )"); } } } /** 深度 **/ int BTNodeDepth(BTNode *b)
下载可编辑
实现二叉树的各种遍历算法实验报告
一 实验题目 : 实现二叉树的各种遍历算法 二 实验要求 :
2.1:(1 ) 输出二叉树 b ( 2)输出 H 节点的左右孩子节点值 ( 3)输出二叉树 b 的深度 ( 4)输出二叉树 b 的宽度 ( 5)输出二叉树 b 的节点个数 ( 6)输出二叉树 b 的叶子节点个数 ( 7)释放二叉树 b

二叉树先序遍历算法

二叉树先序遍历算法

二叉树先序遍历算法
二叉树先序遍历是一种树的遍历算法,先序遍历过程如下:
1. 先访问根节点;
2. 再访问左子节点;
3. 再访问右子节点;
二叉树先序遍历是一种树状数据结构的深度优先搜索(DFS)算法。

先序遍历对
树状数据结构中的每个节点仅进行一次访问,且访问的次序是从上到下,从左到右的方式。

先序遍历属于深度优先搜索,它以一定的次序访问树或图的每个节点,然后递归访问其子节点,深度优先搜索可以按一定方式去遍历有向图、二叉树等数据结构,对节点都进行一定次序的编号或标签,访问顺序是按从小到大的顺序,从而把BST全部访问一次。

二叉树先序遍历的时间复杂度为O(n),空间复杂度为O(logn),应用范围很广,常用于二叉查找树的构造或查找、求树的高度和深度、树的前中后序遍历等,其中在建立二叉查找树时,往往我们都会使用先序遍历;同时,也可用先序遍历来求二叉树的节点数,计算树的深度等。

因此,二叉树先序遍历是一种基本而又重要的数据结构遍历算法,在许多应用
场景中都可以被朂泛使用,深受各个计算机领域的热捧。

二叉树遍历(前中后序遍历,三种方式)

二叉树遍历(前中后序遍历,三种方式)

⼆叉树遍历(前中后序遍历,三种⽅式)⽬录刷题中碰到⼆叉树的遍历,就查找了⼆叉树遍历的⼏种思路,在此做个总结。

对应的LeetCode题⽬如下:,,,接下来以前序遍历来说明三种解法的思想,后⾯中序和后续直接给出代码。

⾸先定义⼆叉树的数据结构如下://Definition for a binary tree node.struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode(int x) : val(x), left(NULL), right(NULL) {}};前序遍历,顺序是“根-左-右”。

使⽤递归实现:递归的思想很简单就是我们每次访问根节点后就递归访问其左节点,左节点访问结束后再递归的访问右节点。

代码如下:class Solution {public:vector<int> preorderTraversal(TreeNode* root) {if(root == NULL) return {};vector<int> res;helper(root,res);return res;}void helper(TreeNode *root, vector<int> &res){res.push_back(root->val);if(root->left) helper(root->left, res);if(root->right) helper(root->right, res);}};使⽤辅助栈迭代实现:算法为:先把根节点push到辅助栈中,然后循环检测栈是否为空,若不空,则取出栈顶元素,保存值到vector中,之后由于需要想访问左⼦节点,所以我们在将根节点的⼦节点⼊栈时要先经右节点⼊栈,再将左节点⼊栈,这样出栈时就会先判断左⼦节点。

代码如下:class Solution {public:vector<int> preorderTraversal(TreeNode* root) {if(root == NULL) return {};vector<int> res;stack<TreeNode*> st;st.push(root);while(!st.empty()){//将根节点出栈放⼊结果集中TreeNode *t = st.top();st.pop();res.push_back(t->val);//先⼊栈右节点,后左节点if(t->right) st.push(t->right);if(t->left) st.push(t->left);}return res;}};Morris Traversal⽅法具体的详细解释可以参考如下链接:这种解法可以实现O(N)的时间复杂度和O(1)的空间复杂度。

实验六二叉树实验报告

实验六二叉树实验报告

实验四二叉树的操作班级:计算机1002班姓名:唐自鸿学号:201003010207 完成日期:2010.6.14 题目:对于给定的一二叉树,实现各种约定的遍历。

一、实验目的:(1)掌握二叉树的定义和存储表示,学会建立一棵特定二叉树的方法;(2)掌握二叉树的遍历算法(先序、中序、后序遍历算法)的思想,并学会遍历算法的递归实现和非递归实现。

二、实验内容:构造二叉树,再实现二叉树的先序、中序、后序遍历,最后统计二叉树的深度。

三、实验步骤:(一) 需求分析1. 二叉树的建立首先要建立一个二叉链表的结构体,包含根节点和左右子树。

因为树的每一个左右子树又是一颗二叉树,所以用递归的方法来建立其左右子树。

二叉树的遍历是一种把二叉树的每一个节点访问并输出的过程,遍历时根结点与左右孩子的输出顺序构成了不同的遍历方法,这个过程需要按照不同的遍历的方法,先输出根结点还是先输出左右孩子,可以用选择语句来实现。

2.程序的执行命令为:1)构造结点类型,然后创建二叉树。

2)根据提示,从键盘输入各个结点。

3)通过选择一种方式(先序、中序或者后序)遍历。

4)输出结果,结束。

(二)概要设计1.二叉树的二叉链表结点存储类型定义typedef struct Node{DataType data;struct Node *LChild;struct Node *RChild;}BitNode,*BitTree;2.建立如下图所示二叉树:void CreatBiTree(BitTree *bt)用扩展先序遍历序列创建二叉树,如果是当前树根置为空,否则申请一个新节点。

3.本程序包含四个模块1) 主程序模块:2)先序遍历模块3)中序遍历模块4)后序遍历模块4.模块调用关系:主程序模块(三)详细设计1.建立二叉树存储类型//==========构造二叉树=======void CreatBiTree(BitTree *bt)//用扩展先序遍历序列创建二叉树,如果是当前树根置为空,否则申请一个新节点//{char ch;ch=getchar();if(ch=='.')*bt=NULL;else{*bt=(BitTree)malloc(sizeof(BitNode));//申请一段关于该节点类型的存储空间(*bt)->data=ch; //生成根结点CreatBiTree(&((*bt)->LChild)); //构造左子树CreatBiTree(&((*bt)->RChild)); //构造右子树}}2. 编程实现以上二叉树的前序、中序和后序遍历操作,输出遍历序列1)先序遍历二叉树的递归算法如下:void PreOrder(BitTree root){if (root!=NULL){Visit(root ->data);PreOrder(root ->LChild); //递归调用核心PreOrder(root ->RChild);}}2)中序遍历二叉树的递归算法如下:void InOrder(BitTree root){if (root!=NULL){InOrder(root ->LChild);Visit(root ->data);InOrder(root ->RChild);}}3)后序遍历二叉树的递归算法如下:void PostOrder(BitTree root){if(root!=NULL){PostOrder(root ->LChild);PostOrder(root ->RChild);Visit(root ->data);}}4)计算二叉树的深度算法如下:int PostTreeDepth(BitTree bt) //求二叉树的深度{int hl,hr,max;if(bt!=NULL){hl=PostTreeDepth(bt->LChild); //求左子树的深度hr=PostTreeDepth(bt->RChild); //求右子树的深度max=hl>hr?hl:hr; //得到左、右子树深度较大者return(max+1); //返回树的深度}else return(0); //如果是空树,则返回0}四、调试分析及测试结果1. 进入演示程序后的显示主界面:请输入二叉树中的元素;先序、中序和后序遍历分别输出结果。

二叉树的各种遍历算法及其深度算法

二叉树的各种遍历算法及其深度算法

二叉树的各种遍历算法及其深度算法一、二叉树的遍历算法二叉树是一种常见的数据结构,遍历二叉树可以按照根节点的访问顺序将二叉树的结点访问一次且仅访问一次。

根据遍历的顺序不同,二叉树的遍历算法可以分为三种:前序遍历、中序遍历和后序遍历。

1. 前序遍历(Pre-order Traversal):首先访问根节点,然后遍历左子树,最后遍历右子树。

可以用递归或者栈来实现。

2. 中序遍历(In-order Traversal):首先遍历左子树,然后访问根节点,最后遍历右子树。

可以用递归或者栈来实现。

3. 后序遍历(Post-order Traversal):首先遍历左子树,然后遍历右子树,最后访问根节点。

可以用递归或者栈来实现。

二、二叉树的深度算法二叉树的深度,也叫做高度,指的是从根节点到叶子节点的最长路径上的节点数目。

可以使用递归或者层次遍历的方式来计算二叉树的深度。

1.递归算法:二叉树的深度等于左子树的深度和右子树的深度的较大值加一、递归的终止条件是当节点为空时,深度为0。

递归的过程中通过不断递归左子树和右子树,可以求出二叉树的深度。

2.层次遍历算法:层次遍历二叉树时,每遍历完一层节点,深度加一、使用一个队列来辅助层次遍历,先将根节点加入队列,然后依次取出队列中的节点,将其左右子节点加入队列,直到队列为空,完成层次遍历。

三、示例为了更好地理解二叉树的遍历和求深度的算法,我们以一个简单的二叉树为例进行说明。

假设该二叉树的结构如下:A/\BC/\/\DEFG其中,A、B、C、D、E、F、G分别代表二叉树的结点。

1.前序遍历:A->B->D->E->C->F->G2.中序遍历:D->B->E->A->F->C->G3.后序遍历:D->E->B->F->G->C->A4.深度:2以上是针对这个二叉树的遍历和深度的计算示例。

实现二叉链表存储结构下二叉树的先序遍历的非递归算法

实现二叉链表存储结构下二叉树的先序遍历的非递归算法

实现二叉链表存储结构下二叉树的先序遍历的非递归算法要实现二叉链表存储结构下二叉树的先序遍历的非递归算法,可以使用栈来辅助存储节点。

首先,创建一个空栈,并将树的根节点压入栈中。

然后,循环执行以下步骤,直到栈为空:1. 弹出栈顶的节点,并访问该节点。

2. 若该节点存在右子节点,则将右子节点压入栈中。

3. 若该节点存在左子节点,则将左子节点压入栈中。

注:先将右子节点压入栈中,再将左子节点压入栈中的原因是,出栈操作时会先访问左子节点。

下面是使用Python语言实现的例子:```pythonclass TreeNode:def __init__(self, value):self.val = valueself.left = Noneself.right = Nonedef preorderTraversal(root):if root is None:return []stack = []result = []node = rootwhile stack or node:while node:result.append(node.val)stack.append(node)node = node.leftnode = stack.pop()node = node.rightreturn result```这里的树节点类为`TreeNode`,其中包含节点的值属性`val`,以及左子节点和右子节点属性`left`和`right`。

`preorderTraversal`函数为非递归的先序遍历实现,输入参数为二叉树的根节点。

函数中使用了一个栈`stack`来存储节点,以及一个列表`result`来存储遍历结果。

在函数中,先判断根节点是否为None。

如果是,则直接返回空列表。

然后,创建一个空栈和结果列表。

接下来,用一个`while`循环来执行上述的遍历过程。

循环的条件是栈`stack`不为空或者当前节点`node`不为None。

树遍历算法实现策略概述

树遍历算法实现策略概述

树遍历算法实现策略概述树遍历算法是计算机科学中常用的一种算法,用于遍历树形数据结构,并按照一定的顺序访问树的节点。

树遍历算法是解决许多与树相关的问题的基础,包括二叉搜索树的查找、排序、删除等操作。

本文将概述树遍历算法的实现策略,旨在帮助读者全面理解和掌握这一常用算法。

1. 深度优先搜索(DFS)深度优先搜索是一种递归的树遍历算法。

该算法从根节点开始,递归地遍历树的每个子树,直到遍历完整棵树或达到终止条件。

在深度优先搜索中,我们可以使用前序、中序或后序三种遍历顺序。

- 前序遍历:先访问根节点,然后再按照左子树、右子树的顺序遍历。

- 中序遍历:先按照左子树、根节点、右子树的顺序遍历。

- 后序遍历:先按照左子树、右子树、根节点的顺序遍历。

2. 广度优先搜索(BFS)广度优先搜索是一种迭代的树遍历算法。

该算法使用队列将树的节点按照层次顺序依次入队和出队,以此实现对整棵树的遍历。

3. 二叉树遍历算法二叉树是一种特殊的树形结构,每个节点最多有两个子节点,即左子节点和右子节点。

针对二叉树的遍历,常用的算法有:- 前序遍历:先访问根节点,再遍历左子树和右子树。

- 中序遍历:先遍历左子树,再访问根节点,最后遍历右子树。

- 后序遍历:先遍历左子树和右子树,最后访问根节点。

4. 多叉树遍历算法多叉树是一种每个节点可以有多个子节点的树形结构。

对于多叉树的遍历,可以使用深度优先搜索或广度优先搜索算法。

5. 树遍历算法的应用场景树遍历算法广泛应用于各种领域,包括图像处理、自然语言处理、编译原理等。

其中,图像处理中的图像分割、自然语言处理中的依存句法分析、编译原理中的语法分析等都依赖于树遍历算法来实现。

总结:树遍历算法是计算机科学中常用的一种算法,用于按照一定顺序访问树结构中的各个节点。

深度优先搜索和广度优先搜索是树遍历的两种基本策略,而针对二叉树和多叉树的遍历有相应的算法。

树遍历算法在各个领域都有广泛的应用场景,深入理解和掌握这些算法,对于解决与树相关的问题具有重要意义。

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

二叉树遍历算法的实现题目:编制二叉树遍历算法的实现的程序一.需求分析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,<root,x1>∈H,且存在D1上的关系H1⊂H;若Dτ≠Φ,则D r中存在唯一的元素x r,<root,x r>∈H,且存在D r上的关系H r⊂H;H={<root,x1>,<root,x r>,H1,H r};(4)(D1,{H1})是符合本定义的二叉树,成为根的左子树,(D r,{H r})是一颗符合本定义的二叉树,成为根的右字树。

基本操作P:InitBiTree(&T);操作结果:构造空二叉树DestroyBiTree(&T)初始条件;二叉树存在操作结果:销毁二叉树CreateBiTree(&T,definition);初始条件:按definition给出二叉树T的定义操作结果:按definition构造二叉树BiTreeEmpty(T)初始条件:二叉树T存在。

操作结果:若二叉树为空树,返回TRUE,否则返回FALSEPreOrderTraverse(T,Visit());初始条件:二叉树T存在,Visit是对节点操作的应用函数。

操作结果:先序遍历T,对每个节点调用函数Visit一次且仅一次。

一旦Visit()失败,则操作失败InOrderTraverse(T,Visit())初始条件:二叉树T存在,Visit是对节点操作的应用函数操作结果:中序遍历二叉树T,对每个节点调用函数Visit一次且仅一次。

一旦visit()失败,则操作失败PostOrderTraverse(T,Visit());初始条件:二叉树T存在,Visit是对节点的应用函数操作结果:后序遍历T,对每个节点调用函数Visit一次且仅一次。

一旦Visit()失败,则操作失败LevelOrderTraverse(T,visit());初始条件:二叉树T存在,Visit是对节点操作的应用函数操作结果:层序遍历T,对每个节点调用函数Visit一次且仅一次。

一旦Visit失败,则操作失败}//ADT BiTree2)栈的抽象数据类型ADT Stack{数据对象D:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}数据关系R:R={<a i-1,a i>|a i-1,a i∈D,i=2,…,n}约定a n端为栈顶,a1端为栈底。

基本操作P:InitStack(&S)操作结果:构造一个空栈StackEmpty(S)初始条件:栈S已存在操作结果;若栈S为空,则返回TRUE,否则返回FALSEGetTop(S,&e)初始条件:栈S已存在且非空操作结果:用e返回S的栈顶元素Push(&S,e)初始条件:栈S已存在操作结果:插入元素e作为新的栈顶元素Pop(&S,&e)初始条件:栈S已存在且非空操作结果:删除栈S 的栈顶元素,且用e返回其值}//ADT Stack3)队列的抽象数据类型ADT Queue{数据对象D:D={a i|a i∈ElemSet,i=1,2,…,n,n≥0}数据关系R:R={<a i-1,a i>|a i-1,a i∈D,i=2,…,n}约定a n端为队列尾,a1端为队列头。

基本操作P:InitQueue(&Q)操作结果:构造一个空队列QQueueEmpty(Q)初始条件:队列Q已存在操作结果:若Q为空队列,则返回TRUE,否则FALSEGetHead(Q,&e)初始条件:Q为非空队列操作结果:用e返回Q的队头元素EnQueue(&Q,e)初始条件:队列Q已存在操作结果:插入元素e为Q的新的队尾元素DeQueue(&Q,&e)初始条件:Q为非空队列操作结果:删除Q的队头元素,并用e返回其值}//ADT Queue2.本实验包括三个程序,每个程序包括的模块有1)二叉树遍历的前序中序后序递归算法a.主程序模块:void main(){初始化;do{接受命令;处理命令;}while(“命令”=“退出”);}b.二叉树模块——实现二叉树的抽象数据类型c.各模块间调用关系为主程序模块二叉树模块2)二叉树的前序中序遍历非递归算法a.主程序模块void main(){初始化;执行二叉树先序输入;执行二叉树前序,中序非递归遍历退出;}b.栈单元模块——实现栈的抽象数据类型c.二叉树模块——实现二叉树的创建与遍历d.各模块间调用关系为主程序模块二叉树单元模块栈单元模块3)二叉树层次遍历算法a.主程序模块void main(){初始化;进行二叉树先序输入进行二叉树层次遍历;退出;b.队列单元模块——实现队列抽象数据类型c.二叉树单元模块——实现二叉树的创建与遍历d.各模块间调用关系主程序模块二叉树模块队列单元模块三.详细设计本程序的一些预定义#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;//Status 是函数的类型,其值是函数结果状态代码typedef int bool;//bool是布尔类型,其值是TRUE或FALSE#define STACK_INIT_SIZE 100//栈的初始分配空间#define STACKINCREMENT 10//栈的空间分配增量1.元素类型,节点类型定义1).二叉树节点类型定义typedefunsignedint ElemTyppe;//二叉树节点中数据元素类型struct BiTNode{ElemType data;struct BiTNode *lchild;struct BiTNode *rchild;}BiTree;2)栈定义struct Stack{struct BiTNode **base;struct BiTNode **top;int SSize;}Stack;3)队列定义struct QNode{struct BiTNode *p;struct QNode *next;};//队列的节点struct Queue{struct QNode *front;struct QNode *rear;}Queue;//指向队列的队首元素和队尾元素2.抽象数据类型定义的实现(伪码表示部分实现)1)二叉树抽象数据类型的实现(除遍历操作外)bool InitBiTree(BiTree &T){T=NULL;return TRUE;}//InitBiTreeStatus CreateBiTree(BiTree &T){//按先序次序输入二叉树中节点的值(非负整数)-1表示空scanf(&a);if(a==-1)T=NULL;else{if(!T=(BiTNode *)malloc(sizeof(BiTNode)))exit(OVERFLOW);T->data=a;CreateBiTree(T->lchild);CreateBiTree(T->rchild);return OK;}//CreaateBiTrevoid DestroyBiTree(BiTree &T){if(!T)return;DestroyBiTree(T->lchild);DestroyBiTree(T->rchild);free(T);T=NULL;}//DestroyBiTreeStatus BiTreeEmpty(BiTree &T){if(T==NULL)return TRUE;return FALSE;}//BiTreeEmpty2)栈的抽象数据类型部分操作实现(伪代码)Status InitStack(Stack &S){S=(Stack *)malloc(STACK_INIT_SIZE*sizeof(Stack));if(!S)return error;S->base=(BiTNode **)malloc(sizeof(BiTNode *));if(!S->base)return error;S->top=S->base;S->SSize=STACK_INIT_SIZE;return OK;}Status StackEmpty(Stack S){if(S->base==S->top)return TRUE;return FALSE;}//StackEmptyStatus GetTop(Stack S,BiTNode &e){if(StackEmpty)//栈为空栈return error;e=*(S->top-1);return OK;Status Push(Stack &S,(BiTNode *)e){if(S->top==S->base+S->SSize){//当前栈已满S->base=(BiTNode**)malloc((S->SSize+STACKINCREMENT)*sizeof(BiTNode *)));if(!S->base)return error;S->top=S->base+S->SSize;S->SSize+=STACKINCREMENT;}//if*(S->top)=e;S->top++;return OK;}//PushStatus Pop(Stack &S,(BiTNode *)&e){if(StackEmpty(S))return error;e=*(S->top-1);S->top--;return OK;}//Pop3)队列抽象数据类型伪代码实现(部分)Status InitQueue(Queue &Q){Q=(Queue *)malloc(sizeof(Queue));if(!Q)return error;Q->rear=Q->front=(QNode *)malloc(sizeof(QNode));if(!Q->rear)return error;Q->front->p=(BiTNode *)malloc(sizeof(BiTNode));if(!Q->front->p)return error;Q->rear->next=NULL;return OK;}//InitQueueStatus QueueEmpty(Queue Q){if(Q->rear==Q->front )return TRUE;elsereturn FALSE;}//QueueEmptyStatus GetHead(Queue Q,(BiTNode *)&p){if(QueueEmpty(Q))//队列为空return FALSE;p=Q->front->next->p;return TRUE;}//GetHeadStatus EnQueue(Queue &Q,(BiTNode *)p){Q->rear->next=(QNode *)malloc(sizeof(QNode));if(!Q->rear->next)return error;Q->rear->next->p=p;Q->rear=Q->rear->next;Q->rear->next=NULL;return OK;}//EnQueueStatus DeQueue(Queue &Q,(BiTNode *)&p){if(QueueEmpty(Q))//队列为空队列return error;if(Q->rear!=Q->front->next){//队列中有多个数据元素p=Q->front->next->p;v=Q->front->next;Q->front->next=Q->front->next->next;free(v);}//ifelse{//队列中有一个数据元素p=Q->front->next->p;v=Q->front->next;Q->rear=Q->front;free(v);Q->front->next=NULL;}//elsereturn OK;}//DeQueue3.遍历算法的实现1)前序中序后序遍历递归算法实现Status PreOrderTraverse(BiTree T,int(* visit)(unsignedint a)){if(T){visit(T->data);PreOrderTraverse(T->lchild,visit);PreOrderTraverse(T->rchild,visit);}//ifreturn OK;}//PreOrderTraverseStatus InOrderTraverse(BiTree T,int (* visit)(unsignedint a)){if(T){InOrderTraverse(T->lchild,visit);(* visit)(T->data);InOrderTraverse(T->rchild,visit);}//ifreturn OK;}//InOrderTraverseStatus PostOrderTraverse(BiTree T,int(* visit)(unsignedint a)){if(T){PostOrderTraverse(T->lchild,visit);PostOrderTraverse(T->rchild,visit);(* visit)(T->data);}//ifreturn OK;}//PostOrdertraverse2)前序,中序非递归算法的实现(利用栈来实现)Status PreOrderTraverse(BiTree T,int(*visit)(unsignedint e)){p=*e=T;InitStack(S);while(*e!=NULL||!StackEmpty(S)){while(*e!=NULL){visit((*e)->data);Push(S,*e);*e=(*e)->lchild;}//whileif(!StackEmpty(S)){S=Pop(S,e);*e=(*e)->rchild;}//if}//whilereturn TRUE;}//PreOrderTraverseStatus InOrderTraverse(BiTree T,int(*visit)(unsignedint e)){p=root;S=InitStack();Push(S,p);while(!StackEmpty(S)){while(GetTop(S,e)&&(*e))Push(S,(*e)->lchild);//向左走到尽头Pop(S,e);//空指针退栈if(!StackEmpty(S)){//访问节点,向右一步Pop(S,e);if(!visit((*e)->data))return FALSE;Push(S,(*e)->rchild);}//if}//whilereturn TRUE;}//InorderTraverse3)二叉树层次遍历实现(用队列)Status LevelOrderTraverse(BiTree T,int(*visit)(unsignedint a)){InitQueue(Q);EnQueue(Q,T);while(!QueueEmpty(Q)){if(GetHead(Q,p)&&(*p)!=NULL){DeQueue(Q,p);EnQueue(Q,(*p)->lchild);EnQueue(Q,(*p)->rchild);visit((*p)->data);}//ifelseif((*p)==NULL){DeQueue(Q,p);//空?指?针?退ª?出?队¨®列¢D}//else if}//whilereturn TRUE;}//LevelOrderTraverse4.主函数及其他函数1)遍历用函数int Print(unsignedint e){printf("%u ",e);return 1;}2)先序中序后序递归算法中菜单程序和命令读入执行程序和主程序int Menu(){int c;printf("\n");printf("1.清屏,并显示功能菜单\n");printf("2.构造一个二叉树\n");printf("3.销毁二叉树\n");printf("4.判断二叉树是否为空?\n");printf("5.采用前序递归算法遍历并打印二叉树节点数据\n");printf("6.采用中序递归算法遍历并打印二叉树节点数据\n");printf("7.采用后序递归算法遍历并打印二叉树节点数据\n");printf("8.退出程序\n");printf("请输入您的选择\n");scanf("%d",&c);return c;}//Menuvoid MenuFunction(int choice,BiTNode &T){switch(choice){case 1:system("cls");break;case 2:printf("请按先序输入各节点数据(数据类型为非负整型,输入-1表示该处无节点指针指向NULL\n");CreatBiTree(T);break;case 3:if(!BiTreeEmpty(T))DestroyBiTree(T);elseprintf("此树为空树\n");break;case 4:a=BiTreeEmpty(T);if(a==1)printf("此树为空\n");elseprintf("此树非空\n");break;case 5:PreOrderTraverse(T,Print);break;case 6:InOrderTraverse(T,Print);break;case 7:PostOrderTraverse(T,Print);break;case 8:exit(0);break;default:printf("输入错误\n");break;}//switch}//MenuFunctionvoid main(){InitBiTree(T);//创建一个空的二叉树printf("系统已自动创建一个空的二叉树\n");do{choice=Menu();MenuFunction(choice,T);printf("是否返回主菜单(Y\\N)\n");scanf(" %c",&c);}while(c=='Y'||c=='y');exit(0);}//main3)先序中序非递归算法主函数void main(){printf("请按先序顺序输入数据,注意事项有:\n");printf("1.数据元素为非负整数\n");printf("2.当输入-1时表示该处无节点\n");InitBiTree(T);CreateBiTree(T);printf("中序非递归算法遍历结果是:\n");a=InOrderTraverse(T,Print);if(!a){printf("遍历失败\n");exit(0);}//ifprintf("\n");printf("前序遍历非递归算法是\n");a=PreOrderTraverse(T,Print);if(!a){printf("遍历失败\n");exit(0);}//if}//main4)层次遍历主函数为void main(){printf("请按先序顺序输入数据,注意事项有:\n");printf("1.数据元素为非负整数\n");printf("2.当输入-1时表示该处无节点\n");InitBiTree(T);CreateBiTree(T);printf("层次遍历算法遍历结果是:\n");a=LevelOrderTraverse(T,Print);if(!a){printf("遍历失败\n");exit(0);}//ifprintf("\n");}//main5.函数调用关系为1)先序中序后序递归算法调用关系为(其PreOrder,InOrder,PostOrder表示PreOrderTraverse,InOrderTraverse,PostOrderTraverse)main()2)先序中序非递归算法函数调用关系为InitBiTree CreateBiTree PreOrder InOrderInitStack Push Pop3)层次遍历函数调用关系为mainInitBiTree CreateBiTree LevelOrderTraverseInitQueue EnQueue DeQueue GetHead四.调试分析1.本程序在实现中序前序的非递归算法时,对于入栈元素的类型一直未明确,导致编译时多处位置出现赋值符两边类型不匹配或者函数参数类型不匹配。

相关文档
最新文档