二叉树的编程与实现(C语言)

这篇具有很好参考价值的文章主要介绍了二叉树的编程与实现(C语言)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

、目的

  1. 掌握指针变量、动态变量的含义;
  2. 掌握二叉树的结构特征,以及各种存储结构的特点及适用范围;
  3. 掌握指针类型描述、访问和处理二叉树的运算;

、环境:

operating system version:Win11

CPU instruction set:  x64

Integrated Development Environment:Viusal Studio 2022

、内容:

已知以二叉树表作为存储结构,写出按层次顺序遍历二叉树的算法。

算法思想:本算法采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点,若它有左子树,便将左子树根结点入队列;若有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉树的目的。

、要求:

  1. 实现二叉树表的层次遍历算法,并给出应用。

、步骤:

1. 程序:

#include "stdio.h"  
#include "stdlib.h"  
#define INITQUEUE 20  
  
typedef struct BiTNode  
{  
    char data;    //定义结点数据  
    struct BiTNode* lchild;//定义结点左孩子指针  
    struct BiTNode* rchild;//定义结点右孩子指针  
}BiTNode, * BiTree;//定义二叉树结点  
  
typedef struct Queue  
{  
    BiTNode* front;//定义队列头指针  
    BiTNode* tail;//定义队列尾指针  
    int size;//定义队列空间大小  
}Queue;  
  
int InitQueue(Queue& Q)  
{//InitQueue初始化队列  
    Q.front = (BiTNode*)malloc(INITQUEUE * sizeof(BiTNode));  
    if (!Q.front)  
    {  
        return 0;  
    }  
    Q.tail = Q.front;  
    Q.size = INITQUEUE;  
    return 1;  
}  
  
bool IsEmpty(Queue Q)  
{//IsEmpty判断队列是否为空  
    if (Q.tail == Q.front)  
    {  
        return true;  
    }  
    else  
    {  
        return false;  
    }  
}  
  
int EnQueue(Queue& Q, BiTNode e)  
{//EnQueue将元素入队列  
    if ((Q.tail - Q.front + INITQUEUE) % INITQUEUE == INITQUEUE - 1)  
    {  
        return 0;  
    }  
    *Q.tail = e;  
    Q.tail++;  
    return 1;  
}  
  
int DeQueue(Queue& Q, BiTNode& e)  
{//DeQueue将元素出队列  
    if (Q.front == Q.tail)  
    {  
        return 0;  
    }  
    e = *Q.front;  
    Q.front++;  
    return 1;  
}  
  
void CreateBiTree(BiTree& T)  
{//构造二叉树  
    char ch;  
    scanf_s("%c", &ch);  
    if ('#' == ch)  
    {  
        T = NULL;  
    }  
    else  
    {  
        T = (BiTree)malloc(sizeof(BiTNode));  
        T->data = ch;  
        CreateBiTree(T->lchild);  
        CreateBiTree(T->rchild);  
    }  
}  
  
int levelTraverse(BiTree T)  
{//二叉树层次遍历  
    if (NULL == T)  
    {  
        return 0;  
    }  
    BiTNode e;  
    Queue Q;  
    int levelcount = 0; //树的深度  
    int curlevel = 1;   //本层里剩余的未访问的结点数  
    int nextlevel = 0;  //下一层还未访问的结点数  
    InitQueue(Q);  
    EnQueue(Q, *T);  
    while (!IsEmpty(Q))//当队列不为空时循环  
    {  
        DeQueue(Q, e);//出队列  
        printf("%c ", e.data);//打印该元素  
        curlevel--;  
        if (NULL != e.lchild)//若左子树不为空  
        {  
            EnQueue(Q, *e.lchild);//将元素入队列  
            nextlevel++;//下一层数自增  
        }  
        if (NULL != e.rchild)//若右子树不为空  
        {  
            EnQueue(Q, *e.rchild);//将元素入队列  
            nextlevel++;  
        }  
        if (0 == curlevel)  
        {  
            levelcount++;  
            printf("——Layer %d node traversal.\n", levelcount);  
            curlevel = nextlevel;  
            nextlevel = 0;  
        }  
    }  
    return 1;  
}  
  
int main(int argc, char* argv[])  
{  
    BiTree T = NULL;  
    printf_s("Please enter the binary tree node:\n");  
    CreateBiTree(T);  
    printf_s("Binary tree created successfully.\n"); 
    printf_s("The hierarchical order traversal of this binary tree is:\n");  
    levelTraverse(T);  
    return 0;  
}  

2.程序结果:

程序运行,在此次、中我使用了二叉树如下

二叉树的编程与实现(C语言)

作为测试样例,因此输入ABC##D##EF##G##。其中定义符号“#”为空结点。、结果如下图所示:

二叉树的编程与实现(C语言)

由输出结果可知,按照层次遍历的顺序分别输出了每一层的元素,可知算法正确实现了二叉树的层次遍历。

3.分析和改进应用:

分析:此次、的整体思路是:层次遍历借助队列实现,首先先定义二叉树及队列的初始3.化,按照常规的方式分别定义队列的判断空IsEmpty函数,入队函数EnQueue与出队函数DeQueue,在二叉树的层次遍历levelTraverse方法中,将二叉树的根结点进入队列中,判断队列不为NULL。打印输出该结点存储的元素。判断结点如果有孩子(左孩子、右孩子),就将孩子进入队列中。循环以上操作,直到 BT->lchild == NULL、BT->rchild=NULL。

改进应用:基于二叉树的层次的层次遍历,可以改进一个有关于二叉树层次遍历的应用,即利用层次遍历求出二叉树的宽度。二叉树的宽度是指二叉树各层结点个数的最大值。因为二叉树的层次遍历借助于队列实现,每次打印当前结点后将其左子树右子树入队,此时队列中既包含当前层的结点,也包含下一层的结点,若我们将当前层的结点全部出队,剩余的就是下一层的结点个数。所以,可以使用maxWidth来表示最大宽度,若下一层的结点个数大于maxWidth,则更新maxWidth,最终队列为空,得到的maxWidth即为二叉树的宽度。实现的函数代码如下:

int WidthCount ( BiTree root) {        
    Queue Q;        
    BiTree T;       
    if (!root)   
        return;  //若是空树则直接返回            
    InitQueue(Q); // 初始化空队列Q    
    int width = 0;  
    int num = 1;  
    int maxWidth = 0;  
    EnQueue(Q,root);       
    while (!IsEmpty(Q))   
    {           
        DeQueue(Q,T);           
        printf("%d ", T->Data); // 访问取出队列的结点            
        if ( T->lchild )     
            EnQueue(Q, T->lchild); width++;          
        if ( T->rchild )    
            EnQueue(Q, T->rchild); width++;    
        if(--num == 0){  
            num = witdh;  
            if(maxWidth < width){  
                maxWidth = width;  
            }  
            width = 0;  
        }  
    }   
    return maxWidth ;  
}  

、小结:

        此次是有关于二叉树层次遍历算法的实现,算法的思想比较清晰,即先定义一个循环队列,使这个队中的数据域存放二叉树中的元素。先将二叉树根结点入队,然后出队,访问该结点,如果有左子树,则将左子树根结点入队;如果存在右子树,则将右子树的根结点入队。然后出队,对出队结点访问,如此循环直到队列为空。最终,出队的顺序就是层次遍历的顺序。关于层次遍历的应用,我是在层次遍历中的特殊结构,即打印结点后把它左右子树入队,该队列中有当前层的结点,也有下一层结点,因此可以将当前层的结点全部出队,剩下的为下一层的结点个数,然后只需要比较当前最多的层结点和下一层结点数的大小即可。文章来源地址https://www.toymoban.com/news/detail-451758.html

到了这里,关于二叉树的编程与实现(C语言)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 二叉树的基本操作-C语言实现-数据结构作业

    目录  (1)二叉树的创建; (2)二叉树的先序、中序和后序遍历输出; (3)输出二叉树的叶子节点和度为2的节点的数量; (4)输出二叉树的深度; (5)将二叉树所有节点的左右子树互换(左子树变右子树,右子树变左子树); (6)参考书上,二叉树按层次输出(一行输出一层); (7)删除二

    2024年02月04日
    浏览(46)
  • 数据结构(C语言实现)——二叉树的概念及二叉树顺序结构和链式结构的实现(堆排序+TOP-K问题+链式二叉树相关操作)

    前面学习了数据结构中线性结构的几种结构,顺序表,链表,栈和队列等,今天我们来学习一种非线性的数据结构——树。由于二叉树是数据结构中的一个重点和难点,所以本文着重介绍二叉树的相关概念和性质,以及二叉树的应用。 树是一种非线性的数据结构,它是由n(

    2023年04月21日
    浏览(43)
  • 数据结构|二叉树的三种遍历方式,你掌握了几种?

    目录 1、遍历方式 2、前序遍历 3、中序遍历 学习二叉树的结构,最简单的方式就是遍历二叉树。遍历二叉树就是 通过某条线路对二叉树的各个结点进行一次访问 ,访问的方法有三种分为前序遍历、中序遍历、后续遍历,层序遍历它们的遍历顺序如下所示: 前序遍历: 根节点

    2023年04月16日
    浏览(46)
  • 【数据结构】一文带你掌握二叉树的构造与应用

    PS : 前面我们已经详细介绍了二叉树的概念以及二叉树的遍历的概念等,一些详细概念知识点可以在下面链接中的博客查看。本文主要需要使用代码自己实现二叉树及应用。 二叉树的概念及遍历 二叉树是由一个节点一个个连接而成的,每个节点最多连接两个节点,所以每个节

    2024年02月08日
    浏览(43)
  • C语言完整代码实现:二叉树的先序遍历、中序遍历、后序遍历

    一、先序遍历原理        先序遍历就是: 根、左、右 ,也就是先遍历根结点再遍历左结点最后再遍历右结点,注意:如果遍历到的结点不是叶子结点的话需要对该结点进行拆分,比如这棵二叉树: 先遍历 A ,然后是 B ,然后再是 C ,但是由于B并不是叶子结点,他本身又是

    2024年02月07日
    浏览(47)
  • 力扣第501题 二叉树的众数 c++ (暴力 加 双指针优化)

    501. 二叉搜索树中的众数 简单 相关标签 树   深度优先搜索   二叉搜索树   二叉树 给你一个含重复值的二叉搜索树(BST)的根节点  root  ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。 如果树中有不止一个众数,可以按  任意顺序  返回。 假定 BST 满足

    2024年02月07日
    浏览(36)
  • 数据结构入门(C语言版)二叉树的顺序结构及堆的概念及结构实现应用

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而完全二叉树更适合使用顺序结构存储。现实中我们通常把堆(一种二叉树)使用 顺序结构的数组来存储 ,需要注意的是 这里的堆和操作系统虚拟进程地址空间中的堆是两回事 ,一个是 数据结构 ,一

    2023年04月19日
    浏览(50)
  • 编程导航算法村第七关 |二叉树的遍历

    先迭代到树的最底层,左左端的元素,然后弹出栈,访问他的右节点 后续遍历相当于在前序遍历的基础上,先访问右节点再访问左节点,最后翻转

    2024年02月14日
    浏览(36)
  • 二叉树的层次遍历(C语言)

    二叉树是n(n=0)个节点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的、分别称为根节点的左子树和右子树组。 先序遍历 中序遍历    后序遍历  层次遍历     一、头文件   二、二叉树的结构   三、队列的结构   四、队列的初始化

    2024年02月07日
    浏览(35)
  • 【C语言 数据结构】二叉树的遍历

    所谓先序遍历二叉树,指的是从根结点出发,按照以下步骤访问二叉树的每个结点: 访问当前结点; 进入当前结点的左子树,以同样的步骤遍历左子树中的结点; 遍历完当前结点的左子树后,再进入它的右子树,以同样的步骤遍历右子树中的结点; 先序遍历这棵二叉树的过

    2024年02月04日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包