二叉树的编程与实现(C语言)
一 、目的:
- 掌握指针变量、动态变量的含义;
- 掌握二叉树的结构特征,以及各种存储结构的特点及适用范围;
- 掌握指针类型描述、访问和处理二叉树的运算;
二 、环境:
operating system version:Win11
CPU instruction set: x64
Integrated Development Environment:Viusal Studio 2022
三 、内容:
已知以二叉树表作为存储结构,写出按层次顺序遍历二叉树的算法。
算法思想:本算法采用一个队列q,先将二叉树根结点入队列,然后退队列,输出该结点,若它有左子树,便将左子树根结点入队列;若有右子树,便将右子树根结点入队列,直到队列空为止。因为队列的特点是先进先出,从而达到按层次顺序遍历二叉树的目的。
四 、要求:
- 实现二叉树表的层次遍历算法,并给出应用。
五 、步骤:
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.程序结果:
程序运行,在此次、中我使用了二叉树如下
作为测试样例,因此输入ABC##D##EF##G##。其中定义符号“#”为空结点。、结果如下图所示:
由输出结果可知,按照层次遍历的顺序分别输出了每一层的元素,可知算法正确实现了二叉树的层次遍历。
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 ;
}
六 、小结:
此次是有关于二叉树层次遍历算法的实现,算法的思想比较清晰,即先定义一个循环队列,使这个队中的数据域存放二叉树中的元素。先将二叉树根结点入队,然后出队,访问该结点,如果有左子树,则将左子树根结点入队;如果存在右子树,则将右子树的根结点入队。然后出队,对出队结点访问,如此循环直到队列为空。最终,出队的顺序就是层次遍历的顺序。关于层次遍历的应用,我是在层次遍历中的特殊结构,即打印结点后把它左右子树入队,该队列中有当前层的结点,也有下一层结点,因此可以将当前层的结点全部出队,剩下的为下一层的结点个数,然后只需要比较当前最多的层结点和下一层结点数的大小即可。
二叉树的编程与实现(C语言)相关推荐
- python和c哪个适合入门-编程入门选什么语言好?C 语言还是Python ?为你解析
前面我分享过计算机行业已经成了学校选择排名第一,家长和学生都很看好计算机类专业.现在IT行业也越来越火爆,程序员越来越被人看好.面对相比同龄人高薪资的诱惑,人们很难不心动,即使秃头也值得! 那么问题来 ...
- “主要的编程范型”及其语言特性关系(多图)
"主要的编程范型"(The principal programming paradigms)这幅图,其实出现得不算早,作者在2007年完成了该图的1.0版,到2008年更新至v1. ...
- 《快乐编程大本营》java语言训练班-第4课:java流程控制
<快乐编程大本营>java语言训练班-第4课:java流程控制 第1节. 顺序执行语句 第2节. 条件分支语句:if条件语句 第3节. 条件分支语句:switch 条件语句 第4节. 条件 ...
- Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树、二叉查找树的插入节点、二叉查找树的删除、二叉树的遍历、平衡二叉树)C 语言实现
Algorithm:树相关算法(BBT/BST/B树/R树)简介(二叉查找树.二叉查找树的插入节点.二叉查找树的删除.二叉树的遍历.平衡二叉树)C++语言实现 目录 树的基础知识 1.二叉树的遍-前序 ...
- 二级c语言上机编程技巧,二级C语言上机编程题技巧总结
二级C语言上机编程题技巧 一. 方法总结 1. 二级C语言上机编程题在二级上机考试中属于较难题型,因此很多同学都害怕通过不了.综合 往年的考试,结合考试大纲,每年考试的编程题都有一定的规律和方法,只要 ...
- c语言超长编程程序,全国青少年软件编程等级考试C语言经典程序题10道五
全国青少年软件编程等级考试C语言经典程序题10道五 [程序41] 题目:学习static定义静态变量的用法 1.程序分析: 2.程序源代码: #include "stdio.h" ...
- 二叉树的创建和遍历-C语言实现
二叉树的创建和遍历-C语言实现 链式存储结构 struct BinaryTreeNode {//数据char data;//左子树BinaryTreeNode *leftChild;//右子树Bina ...
- c++经典编程题_全国青少年软件编程等级考试C语言经典程序题10道十
全国青少年软件编程等级考试C语言经典程序题10道十 [程序91] 题目:时间函数举例1 1.程序分析: 2.程序源代码: #include "stdio.h" #include & ...
- 轻松学c语言编程.pdf等,轻松学编程 轻松学C语言编程pdf
轻松学编程 轻松学C语言编程 内容简介 <轻松学编程:轻松学C语言编程>从初学者的角度出发,以通俗易懂的语言.丰富多彩的实例,详细介绍了使用C语言进行程序开发应该掌握的各方面知识.全书共1 ...
- C/C++ 编程中多国语言处理
C/C++ 编程中多国语言处理 简介: 多国语言的存在,使程序员在编码处理上花费了大量时间和精力:然而各种各样的乱码问题,如 XML 格式错误.文本显示异常.解析器异常等依然层出不穷.特别的,相对于 ...
最新文章
- 这或许是实现重试最优雅的姿势了!
- linux 环境变量 export PATH和PATH有什么区别?
- java中访问修饰符_Java中的访问修饰符介绍
- Oracle 索引概述
- 华硕z170a如何开启m2_「科技犬」新品游戏本、翻转屏评测汇总:华硕微星荣耀戴尔,选谁...
- idea新建java工程
- 游戏中基于物理的渲染简简明科普
- Project Pacific的第一次接触(转)
- semi-global matching 算法总结
- JAVA-1007. 素数对猜想 (20)
- 520超浪漫文艺表白,追求女神必备!!动态Html网页,无编程基础也可娱乐
- 2021年4大免费ER图工具
- GTASA圣安地列斯 DirectX 2.0 ENB 下窗口化运行的解决办法
- eclipse配置Tomcat9
- Google Earth Engine简介
- 微信拼车小程序无服务器,滴滴顺风车下架 拼车微信小程序笑了
- rke 部署的时候报错:Failed to set up SSH tunneling for host
- 【运行报错】Centos 6 无法使用 yum
- PHP MVC框架初探
- Js 获取日期加(减)一天并规范日期格式
热门文章
- qt实现在电脑端群发微信
- 读-《c++设计新思维-泛型编程与设计模式之应用》经典记录(英文书名:《modern c++ design》)
- 33.伪造ICMP请求包进行路由跟踪
- 用Python开发一个自制的编程语言(虚拟机解释型)[2] 词法分析器(2)
- docker命令之 docker commit
- Git远程分支覆盖本地分支的详细介绍
- dBm和mW互相转换公式(以及常用功率对照表)
- C语言下拉式菜单做出字体小,C语言下拉菜单设计-带源代码.ppt
- mysql删除一天前数据_MYSQL如何删除三天前的数据(两个时间比较函数)
- 怎样成为快速阅读的高手(下)