实验六 二叉树的递归遍历及其应用

C语言数据结构实现二叉树递归与非递归遍历(数据结构第四次实验 题目如下: 课程名称:数据结构 实验项目名称:二叉树基本操作的实现 实验目的: 1.掌握树的基本操作—遍历实验要求: 1、    分别用递归和非递归的方法实现一棵树的三种遍历实验过程: 1、    创建一棵二叉树二叉树如下图所示); 2、    用递归算法实现对该树的三种遍历; 3、    用非递归算法实现对该树的三种遍历; 4、    输入选项:0或1,0为递 阅读详情
#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();
}

二叉树的建立、遍历及其应用递归建立二叉树,顺序表建立二叉树 通过二叉树的相关操作深刻理解递归算法以及二叉树的操作算法 最近已经很久没写博客主要是因为没时间,不过最近的这个二叉树我着实又很多的感悟,所以尽管要花时间,我还是想要写下来,希望对大家也有帮助,我会先从二叉树的一些性质讲起,并讲明该性质的作用,最后附上一道综合题及代码详解帮助大家理解 首先是二叉树的性质,及一些重要的算法 1.对于具有n个节点的二叉树,如果按照从上到下从左到右的顺序对所有的节点从零开始顺序编号,则对于i(0<=i<=n)的节点,有: (1)如果i>0,则序号为i的节点的双亲节 阅读详情

相关推荐

实验二叉树递归遍历应用

实验二叉树递归遍历应用 在完善“12.6.4 参考源程序”的前提下,设计并验证如下算法:按中序建立两棵二叉树的二叉链表结构,判断两棵二叉树是否相等,分别求其高度、总结点数目、单分支结点数目、叶结点数目。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<conio.h> typedef struct BiTNode{ char data; struct BiTNode

qq_51233271的博客 1196

数据结构7-二叉树-递归与非递归遍历操作及应用

二叉树遍历应用一、递归遍历算法1.前序2.中序3.后序二、递归遍历算法的应用举例1.创建二叉树2.计算二叉树叶节点个数3.计算二叉树的深度 二叉树遍历就是尊从某种顺序,访问二叉树中的所有节点,使得每一个节点被访问有且仅有1次。二叉树是一种非线性结构,因此按照某种规则遍历二叉树实际就是:试图找到二叉树节点的一个线性序列。

m0_55213627的博客 1058

实验二叉树递归及非递归遍历及其应用

二叉树的创建,前、中、后序遍历递归算法和非递归算法,求叶子结点数目,求二叉树深度,判断二叉树是否相似,求二叉树左右子树互换,二叉树层序遍历的算法,判断二叉树是否是完全二叉树,要求用c语言实现,熟练掌握二叉链表存储结构,谅解非递归遍历过程的栈的应用,灵活运用二叉树的其他操作。

m0_51308557的博客 5247

基于递归调用的二叉树建立、遍历算法实现与应用示例

# 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...

globalwarming的专栏 453

二叉树2】递归遍历【附代码及分析】

写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。解读一下代码,首先是定义部分,在上一篇文章中解释了java中对left和right的理解,剩下部分就是构造函数的书写,记得复习,可能会有提问。剩下的就是在数组中添加下一个节点数据的过程,首先是根节点/中节点,然后是左节点,但是这里对左节点又做了一次传入前序遍历的过程,传入两个参数,根节点/中节点和存放结果的数组。

m0_57733045的博客 445

数据结构实验 二叉树递归遍历应用

1.熟练掌握二叉树的二叉链表结构的定义及其递归遍历算法、按层次遍历算法的C语言实现。2.能深入了解递归算法的执行过程,熟练掌握二叉树递归遍历算法的应用。3.掌握应用系统的用户界面(“菜单”方式)的设计和操作定义方法4.培养学生利用二叉树解决实际问题的能力。

shemzukijata的博客 525

实验二叉树递归及非递归遍历及其应用

#include&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;stdio.h&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; #include&amp;amp;amp;amp;amp;amp;amp;amp;amp;lt;stdlib.h&amp;amp;amp;amp;amp;amp;amp;amp;amp;gt; #define TRUE 1 #define FALSE 0 #define ERRO

ai bohang 的博客 3779

二叉树的建立及其递归遍历(C语言实现)

最近在学习数据结构中树的概念,迟迟不得入门,应该是自己的懒惰和没有勤加练习导致的,以后应该多加练习 以下是我对二叉树的一些总结内容 二叉树的特点有: - 每一个节点最多有两棵子树,所以二叉树中不存在度大于2的节点,注意,是最多有两棵,没有也是可以的 左子树和右子树是有顺序的,次序不能颠倒,这点可以在哈夫曼编码中体现, 顺序不同编码方式不同 -即使树中某个节点中只有一个子树的花,也要区分它...

dream0130__的博客 13万+

二叉树的建立与遍历【数据结构实验报告】

数据结构实验报告实验名称:实验二叉树的建立和遍历学号:***姓名:gnosed实验日期:2017.11.5 一、实验目的1、掌握树的先根构造2、了解树的遍历 二、实验具体内容1、实验题目1:(1)题目构造一棵二叉树,并进行遍历要求:1、二叉树的构造,可以输入树的先根序遍历序列,然后进行构造2、先使用递归的中根,先根,后根序对二叉树遍历,然后对二叉树进行中根序非递归遍历提示:1、  在构造二叉...

_ 4万+

二叉树的非递归遍历

二叉树的非递归遍历 二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。 ​ 三种遍历方式访问节点的顺序是一致的,不同之处在于,有的遍历流程把访问到的节点暂存起来,达成某种条件后再将节点输出。

qq_43169752的博客 1万+

哈工大数据结构实验二——二叉树的建立、遍历及其应用

#include<iostream> #include<fstream> #include<stack> #include<queue> using namespace std; typedef struct BTnode *Tnode; //使用链式结构表示二叉树, struct BTnode{ //声明一个树的节点,它包含这个节点的数据以及指向左儿子和右儿子的指针 char data; Tnode lchild,rchild; //指向左

weixin_45406155的博客 3062

二叉树二叉树的归先序遍历,中序遍历,后序遍历递归和非递归实现

1)递归序,3次见面,第一次见面打印叫先序遍历,第二次见面打印叫中序遍历,第三次见面打印叫后序遍历 2)非递归实现中,先序和后序是相反的,但是中序遍历挺难理解,但是核心思想也就是先去左树,再打印头,然后再去右树。 3)笔试求AC,可以不考虑空间复杂度,但是面试既要考虑时间复杂度最优,也要考虑空间复杂度最优。

weixin_46838716的博客 7734

二叉树递归遍历

递归遍历分为先序遍历,后序遍历,中序遍历,只要理解了一个那么就都理解了

a4364634611的博客 7023

详解二叉树递归遍历与非递归遍历

二叉树遍历 所谓二叉树遍历,是指按某条搜索路径访问树中的每个节点,使得每个节点均被访问一次,而且仅被访问一次。 遍历二叉树需要决定对根节点N、左子树L、右子树R的访问顺序(按照先遍历左子树在遍历右子树的原则),常见的遍历次序有先序(NLR)、中序(LNR)、后序(LRN)三种遍历算法,这也是最常见的二叉树遍历算法。 其中的“序”实际上就是根节点的访问时机。 1. ...

一扣解千愁的博客 8415

数据结构实验五——二叉树递归及非递归遍历及其应用(2021级zzu)

数据结构实验五——二叉树递归及非递归遍历及其应用(2021级zzu)

weixin_69137951的博客 2038

实验二叉树递归及非递归遍历及其应用

实验二叉树递归及非递归遍历及其应用(必做,设计性实验实验目的 熟练掌握二叉树的二叉链表存储结构的C语言实现。掌握二叉树的基本操作-前序、中序、后序遍历二叉树的三种方法。了解非递归遍历过程中“栈”的作用和状态,而且能灵活运用遍历算法实现二叉树的其它操作。 实验内容 (1)二叉树的二叉链表的创建 (2)二叉树的前、中、后序遍历递归算法和非递归算法的实现 (3)求二叉树中叶子结点数目的递归算法。 (4)编写求二叉树深度的递归算法。 (5)编写判断二叉树是否相似的递归算法 (6)编写求二叉

m0_74370659的博客 1337
上一篇: 实验五:稀疏矩阵的存储和快速转置
下一篇: 考完数据结构的一些感想
lijiaying
博客等级 码龄14年 12粉丝 50原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值