#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. 抛弃VS Code,我还能用啥编辑器?| 技术头条
  2. 18岁智商低的表现_吃手是宝宝聪明的信号?婴儿智商高的5个讯号,吃手只是其中一个...
  3. ribbon设置url级别的超时时间
  4. FSLib.Extension库
  5. spring动态代理实现计算器
  6. 【学习笔记】Tableau安装与界面介绍
  7. 给echarts添加筛选时间控件时,控件不显示,并设置数据库无数据时echarts模块显示暂无数据
  8. 2019年6月SAP发布的未来ABAP平台的发展方向
  9. leetcode——Lowest Common Ancestor of a Binary Tree
  10. 真实感人故事_您的数据可以告诉您真实故事吗?
  11. SVN中,A项目如何共享B项目的内容
  12. 【微信小程序】ColorUI——一个多彩漂亮的UI组件库
  13. 记一次阿里云RDS MYSQL 数据恢复的经历
  14. 微信emoji表情数据如何添加到json中
  15. 静态库和动态库的区别
  16. Linux 平台安装 VNC
  17. 清除异常关闭进程的任务栏托盘区残留图标
  18. 重估2020:“黑天鹅”催生的AI新业态
  19. uni-app实战之社区交友APP(9)我的页面开发
  20. java频繁fullgc,fullgc过于频繁该怎么解决?(问题8)

热门文章

  1. ABP理论学习之发布说明
  2. C#实现SQL SERVER2008聚合函数
  3. 著名书画家顾永泉对我诗集出版的贺词
  4. 成功走职场要找准自己的快捷键
  5. 32.go defer
  6. 58. 格式化字符串
  7. 59. Event 例子
  8. 38. Element cloneNode() 方法
  9. Java中反射性能测试
  10. Linux下解决无法远程连接数据库问题