#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语言)相关推荐

  1. 数据结构C++边学边做--二叉树的实现(二叉链表实现遍历操作)

    二叉树的实现(二叉链表实现遍历操作) 一.二叉树的遍历 二.二叉链表的数据结构定义 三.二叉链表类实现 1.类声明 2.BiTree->构造函数:Create创建二叉链表 3.~BiTree-& ...

  2. C语言——二叉树的创建(二叉链表)

    1. 引用 递归构造二叉树的过程中用到了 C++ 语言中的引用 &,引用 & 是变量别名的意思,除了变量名不一样,其他的都是指同一个东西.传参的方式有两种:一种是传值:一种是传址.引用 ...

  3. 二叉链表-创建、遍历(前序、中序、后序、非递归、层次)、复制、计算深度、结点数、销毁(C语言)

    目录 二叉树的定义 二叉树的性质 二叉链表的基本操作 二叉链表的结构定义 前序遍历创建 前序.中序.后序遍历 中序遍历的非递归算法(栈) 层次遍历(队列) 复制二叉树 计算深度 计算总结点数与叶子结点 ...

  4. C++二叉链表的层次遍历

    二叉链表可以用递归算法实现先序遍历,中序遍历和后序遍历,也可以利用栈进行先序遍历,中序遍历和后序遍历.同时,二叉链表也可以借助队列实现层次遍历,基本思想如下: 1. 创建二叉链表,创建对咧 2. 将只 ...

  5. 数据结构知识整理 - 建立二叉链表、复制二叉树、计算二叉树深度、统计二叉树结点数

    主要内容 建立二叉链表 复制二叉树 计算二叉树深度 统计二叉树的结点个数 建立二叉链表 在先序遍历的递归算法中,将输出语句改为输入语句即可.(可回顾"递归算法") 需要注意的是,递 ...

  6. C语言递归实现二叉树(二叉链表)的三种遍历和销毁操作(实验)

    今天写的是二叉树操作的实验,这个实验有三个部分: ①建立二叉树,采用二叉链表结构 ②先序.中序.后续遍历二叉树,输出节点值 ③销毁二叉树 二叉树的节点结构定义 typedef struct BiTNo ...

  7. 数据结构-二叉链表存储的二叉树(利用先序遍历)

    树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用.对于每一个结点至多只有两课子树的一类树,称其为二叉树.二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序.中序遍历 ...

  8. 二叉树的二叉链表存储结构构建以及先序遍历

    #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR -1 typedef int TElemTy ...

  9. 数据结构:(翻转二叉树) 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适

    题目 若二叉树采用二叉链表作存储结构,要交换其所有分支结点的左右子树的位置,采用()遍历方法最合适?(北京航空航天大学1999,北京工业大学2016) A. 前序 B. 中序 C. 后序 D. 层次 ...

  10. 3004基于二叉链表的二叉树的双序遍历(附题意解释)

    描述 设二叉树中每个结点的元素均为一个字符,按先序遍历的顺序建立二叉链表,编写递归算法实现该二叉树的双序遍历(双序遍历是指对于二叉树的每一个结点来说,先访问这个结点,再按双序遍历它的左子树,然后再一次 ...

最新文章

  1. 计算机视觉成安防“显学”落地仍需解决这些难题
  2. 记一次网站部署遇到的问题
  3. ubuntu svn安装
  4. 北京尚学堂|程序员励志名言
  5. 【数理知识】《数值分析》李庆扬老师-第3章-函数逼近与快速傅里叶变换
  6. Codevs 1519 过路费(Mst+Lca)
  7. GDI与OpenGL与DirectX之间的区别
  8. Taro项目遇到的问题
  9. poj1258 Agri-Net 最小生成树Kruskal、Prim
  10. 深度学习2.0-44.对抗生成网络-GAN
  11. 如何交付机器学习项目:一份机器学习工程开发流程指南 1
  12. React 时间控件
  13. 宝马和戴姆勒冻结自动驾驶合作项目
  14. 无法连接阿里云 Windows 实例远程桌面
  15. 8月20日 网工学习 二层交换机功能 MAC地址 交换机的寻址 总结二层交换机,根据源MAC地址进行MAC地址表学习,根据目的MAC地址转发
  16. 大数据开发和java的前景_大数据开发和软件开发哪个前景好?
  17. 零基础学习CANoe Panel(13)—— 滑条(TrackBar )
  18. 2021年最全的自动化测试面试题及答案--看完后吊打面试官!自动化测试是什么?自动化测试学什么?
  19. VBS 请求WebAPI接口_C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
  20. 2021年10月-精品总结汇报PPT模板-15套

热门文章

  1. [PHP] PHP+MYSQL留言板制作
  2. 对Oracle SQL Developer中 变量的学习
  3. 存储过程与业务类实现业务的差异比较
  4. 23. 生成 core dump
  5. 50.远程连接服务器 SSH, XDMCP, VNC, XRDP
  6. 57. web 攻击技术
  7. 2. vi 简介(2)
  8. PADS layout 元件之间尺寸标注
  9. 应用安全-软件安全-漏洞修复整理
  10. SlidingMenu第三篇 --- SlidingMenu使用介绍