#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
ElemType data; /*结点的数据元素*/
struct node *lchild; /*指向左孩子*/
struct node *rchild; /*指向右孩子*/
}BTNode; /*定义二叉树存储结构*/
/*建立二叉树*/
BTNode *CreateBTNode(char *nodes,int pos,int num)
{
BTNode *p;
if(nodes[pos]=='\0'||pos>num)
return NULL;
p=(BTNode *)malloc(sizeof(BTNode)); /*建立根结点*/
if(!p)
return ERROR;
p->data=nodes[pos];
p->lchild=CreateBTNode(nodes,2*pos,num); /*递归建立左子树*/
p->rchild=CreateBTNode(nodes,2*pos+1,num); /*递归建立右子树*/
return p;
}
/*非递归中序遍历二叉树*/
void InOrder(BTNode *b)
{
BTNode *st[MaxSize],*p;
int top=-1;
if(b!=NULL)
{
p=b;
while(top>-1||p!=NULL)
{
while(p!=NULL)
{
top++;
st[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=st[top];
top--;
printf("%c",p->data);
p=p->rchild;
}
}
printf("\n");
}
}
/*递归中序遍历二叉树*/
void InOrder1(BTNode *b)
{
if(b!=NULL)
{
InOrder1(b->lchild); /*递归遍历左子树*/
printf("%c",b->data);
InOrder1(b->rchild); /*递归遍历右子树*/
}
}
/*求二叉树的高度*/
int BTNodeDepth(BTNode *b)
{
int lchilddep,rchilddep;
if(b==NULL)
return 0;
else
{
lchilddep=BTNodeDepth(b->lchild); /*求左子树的高度*/
rchilddep=BTNodeDepth(b->rchild); /*求右子树的高度*/
if(lchilddep>rchilddep)
return lchilddep+1;
else
return rchilddep+1;
}
}
/*用分层形式输出二叉树*/
void DispBTNode(BTNode *b)
{
BTNode *qu[MaxSize];
BTNode *p;
int front,rear,n;
n=0;
front=rear=0;
qu[rear++]=NULL;
p=b;
if(p!=NULL)
qu[rear++]=p;
do{
p=qu[front++];
if(p==NULL)
{
qu[rear++]=NULL;
n++;
printf("\n");
}
else
{
printf("(%d,%2c)",n,p->data);
if(p->lchild!=NULL)
qu[rear++]=p->lchild;
if(p->rchild!=NULL)
qu[rear++]=p->rchild;
}
}while(front!=rear-1);
}
void main()
{
BTNode *b;
char nodes[]="#ABCDEF##G##H###"; /*直接用数组生成二叉树*/
b=CreateBTNode(nodes,1,15);
printf("\n");
DispBTNode(b);
printf("\n");
getch();
printf("InOrder: ");
InOrder(b);
getch();
printf("InOrder1:");
InOrder1(b);
getch();
printf("\n");
printf("Depth:%d\n",BTNodeDepth(b));
getch();
}相关推荐
实验六二叉树的递归遍历及应用
实验六二叉树的递归遍历及应用 在完善“12.6.4 参考源程序”的前提下,设计并验证如下算法:按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> typedef struct BiTNode{ char data; struct BiTNode
数据结构7-二叉树-递归与非递归遍历操作及应用
二叉树的遍历及应用一、递归遍历算法1.前序2.中序3.后序二、递归遍历算法的应用举例1.创建二叉树2.计算二叉树叶节点个数3.计算二叉树的深度 二叉树的遍历就是尊从某种顺序,访问二叉树中的所有节点,使得每一个节点被访问有且仅有1次。二叉树是一种非线性结构,因此按照某种规则遍历二叉树实际就是:试图找到二叉树节点的一个线性序列。
实验五 二叉树的递归及非递归的遍历及其应用
二叉树的创建,前、中、后序遍历的递归算法和非递归算法,求叶子结点数目,求二叉树深度,判断二叉树是否相似,求二叉树左右子树互换,二叉树层序遍历的算法,判断二叉树是否是完全二叉树,要求用c语言实现,熟练掌握二叉链表存储结构,谅解非递归遍历过程的栈的应用,灵活运用二叉树的其他操作。
基于递归调用的二叉树建立、遍历算法实现与应用示例
# include <stdio.h> # include <malloc.h> # include <stdlib.h> # define OK 1 # define OVERFLOW -2 typedef int Status; typedef char BiTreeElemType; typedef struct BiTreeNode{ BiTreeElemType data; struct BiTreeNode *LChild, *RChi...
【二叉树2】递归遍历【附代码及分析】
写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。解读一下代码,首先是定义部分,在上一篇文章中解释了java中对left和right的理解,剩下部分就是构造函数的书写,记得复习,可能会有提问。剩下的就是在数组中添加下一个节点数据的过程,首先是根节点/中节点,然后是左节点,但是这里对左节点又做了一次传入前序遍历的过程,传入两个参数,根节点/中节点和存放结果的数组。
数据结构实验六 二叉树的递归遍历及应用
1.熟练掌握二叉树的二叉链表结构的定义及其递归遍历算法、按层次遍历算法的C语言实现。2.能深入了解递归算法的执行过程,熟练掌握二叉树递归遍历算法的应用。3.掌握应用系统的用户界面(“菜单”方式)的设计和操作定义方法4.培养学生利用二叉树解决实际问题的能力。
实验五 二叉树的递归及非递归遍历及其应用
#include&amp;amp;amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;amp;amp;amp;gt; #define TRUE 1 #define FALSE 0 #define ERRO
二叉树的建立及其递归遍历(C语言实现)
最近在学习数据结构中树的概念,迟迟不得入门,应该是自己的懒惰和没有勤加练习导致的,以后应该多加练习 以下是我对二叉树的一些总结内容 二叉树的特点有: - 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的 左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式不同 -即使树中某个节点中只有一个子树的花,也要区分它...
二叉树的建立与遍历【数据结构实验报告】
数据结构实验报告实验名称:实验四 二叉树的建立和遍历学号:***姓名:gnosed实验日期:2017.11.5 一、实验目的1、掌握树的先根构造2、了解树的遍历 二、实验具体内容1、实验题目1:(1)题目构造一棵二叉树,并进行遍历要求:1、二叉树的构造,可以输入树的先根序遍历序列,然后进行构造2、先使用递归的中根,先根,后根序对二叉树做遍历,然后对二叉树进行中根序非递归遍历提示:1、 在构造二叉...
二叉树的非递归遍历
二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。
哈工大数据结构实验二——二叉树的建立、遍历及其应用
#include<iostream> #include<fstream> #include<stack> #include<queue> using namespace std; typedef struct BTnode *Tnode; //使用链式结构表示二叉树, struct BTnode{ //声明一个树的节点,它包含这个节点的数据以及指向左儿子和右儿子的指针 char data; Tnode lchild,rchild; //指向左
二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现
1)递归序,3次见面,第一次见面打印叫先序遍历,第二次见面打印叫中序遍历,第三次见面打印叫后序遍历 2)非递归实现中,先序和后序是相反的,但是中序遍历挺难理解,但是核心思想也就是先去左树,再打印头,然后再去右树。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。
二叉树的递归遍历
递归遍历分为先序遍历,后序遍历,中序遍历,只要理解了一个那么就都理解了
详解二叉树的递归遍历与非递归遍历
二叉树的遍历 所谓二叉树的遍历,是指按某条搜索路径访问树中的每个节点,使得每个节点均被访问一次,而且仅被访问一次。 遍历二叉树需要决定对根节点N、左子树L、右子树R的访问顺序(按照先遍历左子树在遍历右子树的原则),常见的遍历次序有先序(NLR)、中序(LNR)、后序(LRN)三种遍历算法,这也是最常见的二叉树遍历算法。 其中的“序”实际上就是根节点的访问时机。 1. ...
数据结构实验五——二叉树的递归及非递归的遍历及其应用(2021级zzu)
数据结构实验五——二叉树的递归及非递归的遍历及其应用(2021级zzu)
实验五二叉树的递归及非递归的遍历及其应用
实验五二叉树的递归及非递归的遍历及其应用(必做,设计性实验) 实验目的 熟练掌握二叉树的二叉链表存储结构的C语言实现。掌握二叉树的基本操作-前序、中序、后序遍历二叉树的三种方法。了解非递归遍历过程中“栈”的作用和状态,而且能灵活运用遍历算法实现二叉树的其它操作。 实验内容 (1)二叉树的二叉链表的创建 (2)二叉树的前、中、后序遍历的递归算法和非递归算法的实现 (3)求二叉树中叶子结点数目的递归算法。 (4)编写求二叉树深度的递归算法。 (5)编写判断二叉树是否相似的递归算法 (6)编写求二叉
1196




被折叠的 条评论
为什么被折叠?



