数据结构实验报告二叉排序树精编版

合集下载

数据结构实验报告 二叉树

数据结构实验报告 二叉树

数据结构实验报告二叉树数据结构实验报告:二叉树引言:数据结构是计算机科学中的重要基础,它为我们提供了存储和组织数据的方式。

二叉树作为一种常见的数据结构,广泛应用于各个领域。

本次实验旨在通过实践,深入理解二叉树的概念、性质和操作。

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

二叉树可以为空树,也可以是由根节点和左右子树组成的非空树。

1.2 基本性质(1)每个节点最多有两个子节点;(2)左子树和右子树是有顺序的,不能颠倒;(3)二叉树的子树仍然是二叉树。

二、二叉树的遍历2.1 前序遍历前序遍历是指首先访问根节点,然后按照先左后右的顺序遍历左右子树。

在实际应用中,前序遍历常用于复制一颗二叉树或创建二叉树的副本。

2.2 中序遍历中序遍历是指按照先左后根再右的顺序遍历二叉树。

中序遍历的结果是一个有序序列,因此在二叉搜索树中特别有用。

2.3 后序遍历后序遍历是指按照先左后右再根的顺序遍历二叉树。

后序遍历常用于计算二叉树的表达式或释放二叉树的内存。

三、二叉树的实现与应用3.1 二叉树的存储结构二叉树的存储可以使用链式存储或顺序存储。

链式存储使用节点指针连接各个节点,而顺序存储则使用数组来表示二叉树。

3.2 二叉树的应用(1)二叉搜索树:二叉搜索树是一种特殊的二叉树,它的左子树上的节点都小于根节点,右子树上的节点都大于根节点。

二叉搜索树常用于实现查找、插入和删除等操作。

(2)堆:堆是一种特殊的二叉树,它满足堆序性质。

堆常用于实现优先队列,如操作系统中的进程调度。

(3)哈夫曼树:哈夫曼树是一种带权路径最短的二叉树,常用于数据压缩和编码。

四、实验结果与总结通过本次实验,我成功实现了二叉树的基本操作,包括创建二叉树、遍历二叉树和查找节点等。

在实践中,我进一步理解了二叉树的定义、性质和应用。

二叉树作为一种重要的数据结构,在计算机科学中有着广泛的应用,对于提高算法效率和解决实际问题具有重要意义。

二叉排序树的实验报告

二叉排序树的实验报告

二叉排序树的实验报告二叉排序树的实验报告引言:二叉排序树(Binary Search Tree,简称BST)是一种常用的数据结构,它将数据按照一定的规则组织起来,便于快速的查找、插入和删除操作。

本次实验旨在深入了解二叉排序树的原理和实现,并通过实验验证其性能和效果。

一、实验背景二叉排序树是一种二叉树,其中每个节点的值大于其左子树的所有节点的值,小于其右子树的所有节点的值。

这种特性使得在二叉排序树中进行查找操作时,可以通过比较节点的值来确定查找的方向,从而提高查找效率。

二、实验目的1. 理解二叉排序树的基本原理和性质;2. 掌握二叉排序树的构建、插入和删除操作;3. 验证二叉排序树在查找、插入和删除等操作中的性能和效果。

三、实验过程1. 构建二叉排序树首先,我们需要构建一个空的二叉排序树。

在构建过程中,我们可以选择一个节点作为根节点,并将其他节点插入到树中。

插入节点时,根据节点的值与当前节点的值进行比较,如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

重复这个过程,直到所有节点都被插入到树中。

2. 插入节点在已有的二叉排序树中插入新的节点时,我们需要遵循一定的规则。

首先,从根节点开始,将新节点的值与当前节点的值进行比较。

如果小于当前节点的值,则将其插入到当前节点的左子树中;如果大于当前节点的值,则将其插入到当前节点的右子树中。

如果新节点的值与当前节点的值相等,则不进行插入操作。

3. 删除节点在二叉排序树中删除节点时,我们需要考虑不同的情况。

如果要删除的节点是叶子节点,即没有左右子树,我们可以直接删除该节点。

如果要删除的节点只有一个子树,我们可以将子树连接到要删除节点的父节点上。

如果要删除的节点有两个子树,我们可以选择将其右子树中的最小节点或左子树中的最大节点替代该节点,并删除相应的替代节点。

四、实验结果通过对二叉排序树的构建、插入和删除操作的实验,我们得到了以下结果:1. 二叉排序树可以高效地进行查找操作。

数据结构实验报告二二叉树实验

数据结构实验报告二二叉树实验

实验报告课程名称:数据结构
第 1 页共4 页
五、实验总结(包括心得体会、问题回答及实验改进意见,可附页)
这次实验主要是建立二叉树,和二叉树的先序、中序、后续遍历算法。

通过这次实验,我巩固了二叉树这部分知识,从中体会理论知识的重要性。

在做实验之前,要充分的理解本次实验的理论依据,这样才能达到事半功倍的效果。

如果在没有真正理解实验原理之盲目的开始实验,只会浪费时间和精力。

例如进行二叉树的遍历的时候,要先理解各种遍历的特点。

先序遍历是先遍历根节点,再依次先序遍历左右子树。

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

而后序遍历则是先依次后续遍历左右子树,再访问根节点。

掌握了这些,在实验中我们就可以融会贯通,举一反三。

其次要根据不光要懂得代码的原理,还要对题目有深刻的了解,要明白二叉树的画法,在纸上先进行自我演练,对照代码验证自己写的正确性。

第 3 页共4 页
第 4 页共4 页。

数据结构实验报告二叉树

数据结构实验报告二叉树

数据结构实验报告二叉树《数据结构与算法》实验报告专业班级姓名学号实验项目实验三二叉树。

实验目的1、掌握用递归方法实现二叉树的遍历。

2、加深对二叉树的理解,逐步培养解决实际问题的编程能力。

题目:(1)编写二叉树的遍历操作函数。

①先序遍历,递归方法re_preOrder(TREE *tree)②中序遍历,递归方法re_midOrder(TREE *tree)③后序遍历,递归方法re_postOrder(TREE *tree)(2)调用上述函数实现先序、中序和后序遍历二叉树操作。

算法设计分析(一)数据结构的定义要求用c语言编写一个演示程序,首先建立一个二叉树,让用户输入一个二叉树,实现该二叉树的便利操作。

二叉树型存储结构定义为:typedef struct TNode{ char data;//字符型数据struct TNode *lchild,*rchild;//左右孩子指针}TNode,* Tree;(二)总体设计程序由主函数、二叉树建立函数、先序遍历函数、中序遍历函数、后序遍历函数五个函数组成。

其功能描述如下:(1)主函数:统筹调用各个函数以实现相应功能。

int main()(2)二叉树建立函数:根据用户意愿运用先序遍历建立一个二叉树。

int CreateBiTree(Tree &T)(3)先序遍历函数:将所建立的二叉树先序遍历输出。

void PreOrder(Tree T)(4)中序遍历函数:将所建立的二叉树中序遍历输出。

void InOrder(Tree T)(5)后序遍历函数:将所建立的二叉树后序遍历输出。

void PostOrder(Tree T)(三)各函数的详细设计:(1)建立一个二叉树,按先序次序输入二叉树中结点的值(一个字符),‘#’表示空树。

对T动态分配存储空间,生成根节点,构造左、右子树(2)编写先序遍历函数,依次访问根节点、左子结点、右子节点(3)编写中序遍历函数,依次访问左子结点、根节点、右子节点(4)编写后序遍历函数,依次访问左子结点、右子节点、根节点(5)编写主函数,调用各个函数,以实现二叉树遍历的基本操作。

二叉排序树实验报告

二叉排序树实验报告

深圳大学实验报告
课程名称:数据结构实验与课程设计
实验项目名称:二叉排序树实验
学院:计算机与软件学院
专业:
指导教师:
报告人:学号:班级: 3班
实验时间: 2012-11-28 实验报告提交时间: 2012-12-5
教务部制
int main(int argc,char *argv[])
{
int t[32];
int i,j,Key;
int TestNum,SampleNum;
// freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
BiSortTree *BST=new BiSortTree;
cin>>TestNum;
for(i=0;i<TestNum;i++){
cin>>SampleNum;
for(j=0;j<SampleNum;j++) cin>>t[j];
BST->CreateBST(t,SampleNum);
cin>>Key;
BST->SearchBST(Key);
cout<<BST->BisSuccess<<" "<<BST->BisPos <<" "<<BST->BisCount<<endl;
}
return 0;
}
运行截图:
2、教师批改学生实验报告时间应在学生提交实验报告时间后10日内。

数据结构二叉树的实验报告

数据结构二叉树的实验报告

数据结构二叉树的实验报告数据结构二叉树的实验报告一、引言数据结构是计算机科学中非常重要的一个领域,它研究如何组织和存储数据以便高效地访问和操作。

二叉树是数据结构中常见且重要的一种,它具有良好的灵活性和高效性,被广泛应用于各种领域。

本实验旨在通过实际操作和观察,深入了解二叉树的特性和应用。

二、实验目的1. 理解二叉树的基本概念和特性;2. 掌握二叉树的创建、遍历和查找等基本操作;3. 通过实验验证二叉树的性能和效果。

三、实验过程1. 二叉树的创建在实验中,我们首先需要创建一个二叉树。

通过输入一系列数据,我们可以按照特定的规则构建一棵二叉树。

例如,可以按照从小到大或从大到小的顺序将数据插入到二叉树中,以保证树的有序性。

2. 二叉树的遍历二叉树的遍历是指按照一定的次序访问二叉树中的所有节点。

常见的遍历方式有前序遍历、中序遍历和后序遍历。

前序遍历是先访问根节点,然后再依次遍历左子树和右子树;中序遍历是先遍历左子树,然后访问根节点,最后再遍历右子树;后序遍历是先遍历左子树,然后遍历右子树,最后访问根节点。

3. 二叉树的查找二叉树的查找是指在二叉树中寻找指定的节点。

常见的查找方式有深度优先搜索和广度优先搜索。

深度优先搜索是从根节点开始,沿着左子树一直向下搜索,直到找到目标节点或者到达叶子节点;广度优先搜索是从根节点开始,逐层遍历二叉树,直到找到目标节点或者遍历完所有节点。

四、实验结果通过实验,我们可以观察到二叉树的特性和性能。

在创建二叉树时,如果按照有序的方式插入数据,可以得到一棵平衡二叉树,其查找效率较高。

而如果按照无序的方式插入数据,可能得到一棵不平衡的二叉树,其查找效率较低。

在遍历二叉树时,不同的遍历方式会得到不同的结果。

前序遍历可以用于复制一棵二叉树,中序遍历可以用于对二叉树进行排序,后序遍历可以用于释放二叉树的内存。

在查找二叉树时,深度优先搜索和广度优先搜索各有优劣。

深度优先搜索在空间复杂度上较低,但可能会陷入死循环;广度优先搜索在时间复杂度上较低,但需要较大的空间开销。

数据结构实验报告—二叉树

数据结构实验报告—二叉树

数据结构实验报告—二叉树数据结构实验报告—二叉树引言二叉树是一种常用的数据结构,它由节点和边构成,每个节点最多有两个子节点。

在本次实验中,我们将对二叉树的基本结构和基本操作进行实现和测试,并深入了解它的特性和应用。

实验目的1. 掌握二叉树的基本概念和特性2. 熟练掌握二叉树的基本操作,包括创建、遍历和查找等3. 了解二叉树在实际应用中的使用场景实验内容1. 二叉树的定义和存储结构:我们将首先学习二叉树的定义,并实现二叉树的存储结构,包括节点的定义和节点指针的表示方法。

2. 二叉树的创建和初始化:我们将实现二叉树的创建和初始化操作,以便后续操作和测试使用。

3. 二叉树的遍历:我们将实现二叉树的前序、中序和后序遍历算法,并测试其正确性和效率。

4. 二叉树的查找:我们将实现二叉树的查找操作,包括查找节点和查找最大值、最小值等。

5. 二叉树的应用:我们将探讨二叉树在实际应用中的使用场景,如哈夫曼编码、二叉搜索树等。

二叉树的定义和存储结构二叉树是一种特殊的树形结构,它的每个节点最多有两个子节点。

节点被表示为一个由数据和指向其左右子节点的指针组成的结构。

二叉树可以分为三类:满二叉树、完全二叉树和非完全二叉树。

二叉树可以用链式存储结构或顺序存储结构表示。

- 链式存储结构:采用节点定义和指针表示法,通过将节点起来形成一个树状结构来表示二叉树。

- 顺序存储结构:采用数组存储节点信息,通过计算节点在数组中的位置来进行访问和操作。

二叉树的创建和初始化二叉树的创建和初始化是二叉树操作中的基础部分。

我们可以通过手动输入或读取外部文件中的数据来创建二叉树。

对于链式存储结构,我们需要自定义节点和指针,并通过节点的方式来构建二叉树。

对于顺序存储结构,我们需要定义数组和索引,通过索引计算来定位节点的位置。

一般来说,初始化一个二叉树可以使用以下步骤:1. 创建树根节点,并赋初值。

2. 创建子节点,并到父节点。

3. 重复步骤2,直到创建完整个二叉树。

数据结构二叉树实验报告总结

数据结构二叉树实验报告总结

数据结构二叉树实验报告总结一、实验目的本次实验的主要目的是通过对二叉树的学习和实践,掌握二叉树的基本概念、性质和遍历方式,加深对数据结构中树形结构的理解。

二、实验内容1. 二叉树的基本概念和性质在本次实验中,我们首先学习了二叉树的基本概念和性质。

其中,二叉树是由节点组成的有限集合,并且每个节点最多有两个子节点。

同时,我们还学习了二叉树的高度、深度、层数等概念。

2. 二叉树的遍历方式在了解了二叉树的基本概念和性质之后,我们开始学习如何遍历一个二叉树。

在本次实验中,我们主要学习了三种遍历方式:前序遍历、中序遍历和后序遍历。

其中,前序遍历指先访问节点自身再访问左右子节点;中序遍历指先访问左子节点再访问自身和右子节点;后序遍历指先访问左右子节点再访问自身。

3. 二叉搜索树除了以上内容之外,在本次实验中我们还学习了一种特殊的二叉树——二叉搜索树。

二叉搜索树是一种特殊的二叉树,它的每个节点都满足左子节点小于该节点,右子节点大于该节点的性质。

由于这个性质,二叉搜索树可以被用来进行快速查找、排序等操作。

三、实验过程1. 实现二叉树的遍历方式为了更好地理解和掌握二叉树的遍历方式,我们首先在编程环境中实现了前序遍历、中序遍历和后序遍历。

在代码编写过程中,我们需要考虑如何递归地访问每个节点,并且需要注意访问顺序。

2. 实现二叉搜索树为了更好地理解和掌握二叉搜索树的特性和操作,我们在编程环境中实现了一个简单的二叉搜索树。

在代码编写过程中,我们需要考虑如何插入新节点、删除指定节点以及查找目标节点等操作。

3. 实验结果分析通过对代码运行结果进行分析,我们可以清晰地看到每个遍历方式所得到的结果以及对应的顺序。

同时,在对二叉搜索树进行操作时,我们也可以看到不同操作所产生的不同结果。

四、实验总结通过本次实验,我们进一步加深了对二叉树的理解和掌握,学习了二叉树的遍历方式以及二叉搜索树的特性和操作。

同时,在编程实践中,我们也进一步熟悉了代码编写和调试的过程。

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

《数据结构》实验报告◎实验题目: 创建一个二叉排序树,并以先序、中序、后序遍历输出。

◎实验目的:熟练掌握二叉排序树建立的算法◎实验内容:已知n个元素,创建一个二叉排序树,以先序、中序、后序遍历输出,并计算每个节点的平衡因子。

一、需求分析1.本程序输入应为一组数,将这组数作为关键字创建一个二叉排序树。

2.本程序输出应为该建立好的二叉排序树的先序、中序、后序遍历输出,以及每个节点的平衡因子。

3. 程序执行的命令包括:(1)创建二叉排序树(2)先序非递归遍历输出(3)中序非递归遍历输出(4)后序非递归遍历输出(5)计算并输出每个节点的平衡因子4.测试数据:输入元素的个数为8,元素为53 25 76 20 48 14 60 84输出为:先序遍历:53 25 20 14 48 76 60 84中序遍历:14 20 25 48 53 60 76 84后序遍历:14 20 48 25 60 84 76 53平衡因子:节点53的平衡因子为1节点25的平衡因子为1节点20的平衡因子为1节点14的平衡因子为0节点48的平衡因子为0节点76的平衡因子为0节点60的平衡因子为0节点84的平衡因子为0二概要设计为了实现以上操作,应以二叉链表为存储结构。

1.基本操作:node *create()创建二叉排序树void NRPreorder(node *bt)先序非递归遍历输出void NRinorder(node *bt)中序非递归遍历输出void NRpostorder(node *bt)后序非递归遍历输出int height(node *bt)计算左右子树深度void shendu(node *bt)计算平衡因子2.本程序包含七个模块(1)主程序模块(2)二叉排序树创建模块(3)(4)(5)(6)(7)3.三详细设计1.元素类型,结点类型和指针类型:#define maxsize 100typedef struct node{char data;struct node *lc;struct node *rc;}node;node *s[maxsize];node *bt;node *q,*p;2.每个模块的分析:(1)主程序模块:int main(){node *bt;bt=create();printf("该二叉树的先序递归遍历序列为: ");preorder(bt);printf("\n");printf("该二叉树的中序递归遍历序列为: ");inorder(bt);printf("\n");printf("该二叉树的后序递归遍历序列为: ");postorder(bt);printf("\n");printf("该二叉树的先序非递归遍历序列为:");NRPreorder(bt);printf("\n");printf("该二叉树的中序非递归遍历序列为:");NRinorder(bt);printf("\n");printf("该二叉树的后序非递归遍历序列为:");NRpostorder(bt);printf("\n");printf("以先序遍历输出该二叉树,每个节点的平衡因子如下:\n");shendu(bt);getchar();getchar();return 0;}(2)二叉排序树创建模块:node *create(){node *bt;node *q,*p;bt=NULL; /*根节点指针置空*/int x;int i;int m;int j;printf("请输入数据个数:\n");scanf("%d",&m);printf("请输入数据:\n");for(j=0;j<m;j++){scanf("%d",&x);i=0;q=(node *)malloc(sizeof(node)); /*申请新节点,将新节点数据域赋值,左右孩子置空*/q->data=x;q->lc=q->rc=NULL;if(bt==NULL) /*如果根节点指针为空,将其指向新申请节点*/bt=q;else{p=bt; /*活动指针指向根节点*/while(i==0){if(p->data>x) /*如果新输入的数值比当前节点的数值小*/{if(p->lc!=NULL) /*如果当前节点的左孩子不为空,将活动指针移到它的左孩子*/p=p->lc;else /*否则将新申请节点链到当前节点的左孩子,将i标记为1,表示已处理*/{p->lc=q;i=1;}}else /*否则沿右链域比较*/{if(p->rc!=NULL)p=p->rc;else /*直到终端,插入输入节点*/{p->rc=q;i=1;}}}}}return bt;}(3)先序遍历模块:void NRPreorder(node *bt){node *p;top=-1;top++;s[top]=bt;while(top!=-1){p=s[top--];while(p){printf("%d ",p->data);top++;s[top]=p->rc;p=p->lc;}}}(4)中序遍历模块void NRinorder(node *bt){node *p;int top;if(bt==NULL) return;top=0;p=bt;while(!(p==NULL&&top==0)){while(p!=NULL){s[top]=p;top++;p=p->lc;}if(top<=0)return;else{top--;p=s[top];printf("%d ",p->data);p=p->rc;}}}(5)后序遍历模块:void NRpostorder(node *bt){node *p,*q;int top=-1;int flag;p=bt;if(p!=NULL){do{while(p!=NULL){top++;s[top]=p;p=p->lc;}q=NULL;flag=1;while(top!=-1&&flag){p=s[top];if(p->rc==q){printf("%d ",p->data);top--;q=p;}else{p=p->rc;flag=0;}}} while (top!=-1);}}(6)计算左右子树深度模块int height(node *bt){int hl,hr;if(bt==NULL) /*利用递归算法求左右子树的深度*/ return 0;else{hl=height(bt->lc);hr=height(bt->rc);if(hl>hr)return (hl+1);elsereturn (hr+1);}}(7)计算平衡因子模块void shendu(node *bt){int sl,sr;int ph;node *p;top=-1;top++;s[top]=bt;while(top!=-1){p=s[top--];while(p){sl=height(p->lc); /*当前节点左子树的深度*/sr=height(p->rc); /*当前节点右子树的深度*/ph=sl-sr; /*当前节点的平衡因子*/printf("节点为%d的平衡因子为%d\n",p->data,ph);top++;s[top]=p->rc;p=p->lc;}}3.4. 完整的程序:(见源文件).四使用说明、测试分析及结果1.程序使用说明(1)本程序的运行环境为VC6.0。

(2)进入演示程序后即显示提示信息:请输入数据个数:请输入数据:输入完数据以三种形式输出二叉排序树,并输出每个节点的平衡因子.2.测试数据:输入元素的个数为8,元素为53 25 76 20 48 14 60 84输出为:先序遍历:53 25 20 14 48 76 60 84中序遍历:14 20 25 48 53 60 76 84后序遍历:14 20 48 25 60 84 76 53平衡因子:节点53的平衡因子为1节点25的平衡因子为1节点20的平衡因子为1节点14的平衡因子为0节点48的平衡因子为0节点76的平衡因子为0节点60的平衡因子为0节点84的平衡因子为03.运行界面:五、实验总结本次试验过程比较顺利,由于上次的二叉树积累了经验,所以这次编得比较快,编程过程中没有出现问题,通过这次编程对于二叉树有了更进一步的熟悉和了解,可以熟练编写二叉排序树,熟悉了二叉排序树的结构,并且对于计算节点的深度以及节点的平衡因子有了一定的掌握。

教师评语:实验成绩:#include<stdio.h>#include<malloc.h>#define maxsize 100//定义结构体typedef struct node{char data;struct node *lc;struct node *rc;}node;//定义栈node *s[maxsize];int top=-1;//创建二叉排序树node *create(){node *bt;node *q,*p;bt=NULL; /*根节点指针置空*/int x;int i;int m;int j;printf("请输入数据个数:\n");scanf("%d",&m);printf("请输入数据:\n");for(j=0;j<m;j++){scanf("%d",&x);i=0;q=(node *)malloc(sizeof(node)); /*申请新节点,将新节点数据域赋值,左右孩子置空*/q->data=x;q->lc=q->rc=NULL;if(bt==NULL) /*如果根节点指针为空,将其指向新申请节点*/bt=q;else{p=bt; /*活动指针指向根节点*/while(i==0){if(p->data>x) /*如果新输入的数值比当前节点的数值小*/{if(p->lc!=NULL) /*如果当前节点的左孩子不为空,将活动指针移到它的左孩子*/p=p->lc;else /*否则将新申请节点链到当前节点的左孩子,将i标记为1,表示已处理*/{p->lc=q;i=1;}}else /*否则沿右链域比较*/{if(p->rc!=NULL)p=p->rc;else /*直到终端,插入输入节点*/{p->rc=q;i=1;}}}}}return bt;}//先序递归遍历void preorder(node *bt){if(bt!=NULL){printf("%d ",bt->data);preorder(bt->lc);preorder(bt->rc);}}//中序递归遍历void inorder(node *bt){if(bt!=NULL){inorder(bt->lc);printf("%d ",bt->data);inorder(bt->rc);}}//后序递归遍历void postorder(node *bt){if(bt!=NULL){postorder(bt->lc);postorder(bt->rc);printf("%d ",bt->data);}}//先序非递归遍历void NRPreorder(node *bt){node *p;top=-1;top++;s[top]=bt;while(top!=-1){p=s[top--];while(p){printf("%d ",p->data); top++;s[top]=p->rc;p=p->lc;}}}//中序非递归遍历void NRinorder(node *bt){node *p;int top;if(bt==NULL) return;top=0;p=bt;while(!(p==NULL&&top==0)){while(p!=NULL){s[top]=p;top++;p=p->lc;}if(top<=0)return;else{top--;p=s[top];printf("%d ",p->data);p=p->rc;}}}//后序非递归遍历void NRpostorder(node *bt){node *p,*q;int top=-1;int flag;p=bt;if(p!=NULL){do{while(p!=NULL){top++;s[top]=p;p=p->lc;}q=NULL;flag=1;while(top!=-1&&flag){p=s[top];if(p->rc==q){printf("%d ",p->data);top--;q=p;}else{p=p->rc;flag=0;}}} while (top!=-1);}}//计算平衡因子int height(node *bt){int hl,hr;if(bt==NULL) /*利用递归算法求左右子树的深度*/ return 0;else{hl=height(bt->lc);hr=height(bt->rc);if(hl>hr)return (hl+1);elsereturn (hr+1);}}void shendu(node *bt){int sl,sr;int ph;node *p;top=-1;top++;s[top]=bt;while(top!=-1){p=s[top--];while(p){sl=height(p->lc); /*当前节点左子树的深度*/sr=height(p->rc); /*当前节点右子树的深度*/ph=sl-sr; /*当前节点的平衡因子*/printf("节点为%d的平衡因子为%d\n",p->data,ph); top++;s[top]=p->rc;p=p->lc;}}}int main(){node *bt;bt=create();printf("该二叉树的先序递归遍历序列为: ");preorder(bt);printf("\n");printf("该二叉树的中序递归遍历序列为: ");inorder(bt);printf("\n");printf("该二叉树的后序递归遍历序列为: ");postorder(bt);printf("\n");printf("该二叉树的先序非递归遍历序列为:");NRPreorder(bt);printf("\n");printf("该二叉树的中序非递归遍历序列为:");NRinorder(bt);printf("\n");printf("该二叉树的后序非递归遍历序列为:");NRpostorder(bt);printf("\n");printf("以先序遍历输出该二叉树,每个节点的平衡因子如下:\n");shendu(bt);getchar();getchar();return 0;}。

相关文档
最新文档