c语言二叉树层序遍历,二叉树二叉链表的层序遍历(C语言)
#include #include
/**
* 二叉树二叉链表之非递归遍历:层序遍历
* 算法思想:借助一个队列;根树进队;队不为空时循环“从队列中出一个树p,访问该树根结点;
* 若它有左子树,左子树进队;若它有右子树,右子树进队。”
* (保证了元素进队顺序是从树的上层到下层,且同层元素在队列中从左到右相邻)
* (注:为了节约空间,这里的树进队,是指树的地址进队,而不是树结点进队,队列中存放的是对各树地址的引用)*/
#define OK 1;
#define TURE 1;
#define FALSE 0;
#define ERROR 0;
const int OVERFLOW = -2;const int MAXSIZE = 100;
typedefintStatus;
typedefcharTElemType;//二叉链表结构定义
typedef structBiNode{
TElemType data;struct BiNode *lchild, *rchild;
} BiNode,*BiTree;//顺序循环队列定义
typedef struct{
BiTree*base; //存放树型指针
int front; //头指针,若队列不为空,指向队列头元素
int rear; //尾指针,若队列不为空,指向队列尾元素的下一个位置
} SqQueue;//由字符序列创建二叉树
Status CreateBiTree(BiTree *tree,TElemType data[],int *j,intlen){if((*j)<=len-1){if(data[(*j)]==‘#‘){
(*tree)=NULL;
(*j)++;
}else{
(*tree)=(BiTree)malloc(sizeof(BiNode));if(!(*tree)) returnOVERFLOW;
(*tree)->data=data[(*j)]; //生成根结点
(*j)++;
CreateBiTree(&((*tree)->lchild),data,j,len); //构造左子树
CreateBiTree(&((*tree)->rchild),data,j,len); //构造右子树
}
}returnOK;
}//访问二叉树结点
Status Visit(BiTree tree){
printf("%c",tree->data);returnOK;
}//借助队列实现二叉链表的层序遍历
Status LevelOrder_ByQueue(BiTree tree) {
BiTree p;
SqQueue queue1;
InitQueue(&queue1);
EnQueue(&queue1,tree); //根结点入队
while(queue1.front!=queue1.rear){ //队不为空
DeQueue(&queue1,&p); //根节点出队
Visit(p);if(p->lchild!=NULL) EnQueue(&queue1,p->lchild); //有左孩子就进队
if(p->rchild!=NULL) EnQueue(&queue1,p->rchild); //有右孩子也进队
}returnOK;
}/***用到队列的相关函数***/
//循环队列初始化
Status InitQueue(SqQueue *queue) {
queue->base=(BiTree*)malloc(sizeof(BiTree)*MAXSIZE); //分配队列数组空间
if(!queue->base) return OVERFLOW; //分配失败
queue->front=0;
queue->rear=0;returnOK;
}//循环队列入队操作
Status EnQueue(SqQueue *queue,BiTree elem){if((queue->rear+1)%MAXSIZE==queue->front){ //队满
returnERROR;
}else{
queue->base[queue->rear]=elem;
queue->rear=(queue->rear+1)%MAXSIZE;returnOK;
}
}//循环队列出队操作
Status DeQueue(SqQueue *queue,BiTree *elem){if(queue->front==queue->rear){ //队空
returnERROR;
}else{
(*elem)=queue->base[queue->front];
queue->front=(queue->front+1)%MAXSIZE;returnOK;
}
}int main(void){//示例二叉树的结构
/*A
/
B
/ C D
/ E F
G*/
//指向二叉树的指针
BiTree bitree1;//创建二叉树 待用数据
TElemType data1[]={‘A‘,‘B‘,‘C‘,‘#‘,‘#‘,‘D‘,‘E‘,‘#‘,‘G‘,‘#‘,‘#‘,‘F‘,‘#‘,‘#‘,‘#‘,}; //先序遍历序列
int len1=sizeof(data1)/sizeof(data1[0]);int* j1=(int*)malloc(sizeof(int));*j1=0;//按先序遍历序列创建二叉树
Status createBiTreeResult = CreateBiTree(&bitree1,data1,j1,len1);
printf("二叉树创建结果:%d\n",createBiTreeResult);//层序遍历二叉树
Status levelOrder_ByQueue = LevelOrder_ByQueue(bitree1); //注:这里参数是二叉树根结点,而不是指针
printf("\n层序遍历二叉树结果:%d\n",levelOrder_ByQueue);
printf("\nEND");return 0;
}
c语言二叉树层序遍历,二叉树二叉链表的层序遍历(C语言)相关推荐
- 数据结构C++边学边做--二叉树的实现(二叉链表实现遍历操作)
二叉树的实现(二叉链表实现遍历操作) 一.二叉树的遍历 二.二叉链表的数据结构定义 三.二叉链表类实现 1.类声明 2.BiTree->构造函数:Create创建二叉链表 3.~BiTree-& ...
- C语言——二叉树的创建(二叉链表)
1. 引用 递归构造二叉树的过程中用到了 C++ 语言中的引用 &,引用 & 是变量别名的意思,除了变量名不一样,其他的都是指同一个东西.传参的方式有两种:一种是传值:一种是传址.引用 ...
- 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)
目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...
- C++二叉链表的层次遍历
二叉链表可以用递归算法实现先序遍历,中序遍历和后序遍历,也可以利用栈进行先序遍历,中序遍历和后序遍历.同时,二叉链表也可以借助队列实现层次遍历,基本思想如下: 1. 创建二叉链表,创建对咧 2. 将只 ...
- 数据结构知识整理 - 建立二叉链表、复制二叉树、计算二叉树深度、统计二叉树结点数
主要内容 建立二叉链表 复制二叉树 计算二叉树深度 统计二叉树的结点个数 建立二叉链表 在先序遍历的递归算法中,将输出语句改为输入语句即可.(可回顾"递归算法") 需要注意的是,递 ...
- C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)
今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...
- 数据结构-二叉链表存储的二叉树(利用先序遍历)
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...
- 二叉树的二叉链表存储结构构建以及先序遍历
#include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTy ...
- 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适
题目 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?(北京航空航天大学1999,北京工业大学2016) A. 前序 B. 中序 C. 后序 D. 层次 ...
- 3004基于二叉链表的二叉树的双序遍历(附题意解释)
描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法实现该二叉树的双序遍历(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次 ...
最新文章
- 计算机视觉成安防“显学”落地仍需解决这些难题
- 记一次网站部署遇到的问题
- ubuntu svn安装
- 北京尚学堂|程序员励志名言
- 【数理知识】《数值分析》李庆扬老师-第3章-函数逼近与快速傅里叶变换
- Codevs 1519 过路费(Mst+Lca)
- GDI与OpenGL与DirectX之间的区别
- Taro项目遇到的问题
- poj1258 Agri-Net 最小生成树Kruskal、Prim
- 深度学习2.0-44.对抗生成网络-GAN
- 如何交付机器学习项目:一份机器学习工程开发流程指南 1
- React 时间控件
- 宝马和戴姆勒冻结自动驾驶合作项目
- 无法连接阿里云 Windows 实例远程桌面
- 8月20日 网工学习 二层交换机功能 MAC地址 交换机的寻址 总结二层交换机,根据源MAC地址进行MAC地址表学习,根据目的MAC地址转发
- 大数据开发和java的前景_大数据开发和软件开发哪个前景好?
- 零基础学习CANoe Panel(13)—— 滑条(TrackBar )
- 2021年最全的自动化测试面试题及答案--看完后吊打面试官!自动化测试是什么?自动化测试学什么?
- VBS 请求WebAPI接口_C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
- 2021年10月-精品总结汇报PPT模板-15套