c语言实现二叉树层次遍历(借助队列实现)

转载 2015年07月10日 16:17:44



//c语言实现二叉树层次遍历(借助队列实现)

#include <stdio.h>
#include <stdlib.h>
 
//二叉链表类型定义
typedef struct btnode
{
char data;
struct btnode *lchild,*rchild;
}bitree,*Bitree;


//链队列类型定义
typedef struct LinkQueueNode
{
bitree *data;
struct LinkQueueNode *next;
}LKQueNode;


typedef struct LKQueue
{
LKQueNode *front,*rear;
}LKQue;


//初始化队列
void InitQueue(LKQue *LQ)
{
LKQueNode *p;
p = (LKQueNode*)malloc(sizeof(LKQueNode));
LQ->front = p;
LQ->rear = p;
LQ->front->next = NULL;
}


//判断队列是否为空
int EmptyQueue(LKQue *LQ)
{
if(LQ->front == LQ->rear)
return 1;
else 
return 0;
}


//入队列
void EnQueue(LKQue *LQ,Bitree x)
{
LKQueNode *p;
p = (LKQueNode*)malloc(sizeof(LKQueNode));
p->data = x;
p->next = NULL;
LQ->rear->next = p;
LQ->rear = p;
}


//出队列
int OutQueue(LKQue *LQ)
{
LKQueNode *s;
if ( EmptyQueue(LQ))
{
exit(0);
return 0;
}
else
{
s = LQ->front->next;
LQ->front->next = s->next;
if(s->next == NULL)
LQ->rear = LQ->front;
free(s);
return 1;
}
}


//取队列首元素
Bitree GetHead(LKQue *LQ)
{
LKQueNode *p;
bitree *q;
if(EmptyQueue(LQ))
return q;
else 
{
p = LQ->front->next;
return p->data;
}



//建二叉树
Bitree Initiate()
{
char ch;
Bitree t;
ch = getchar();    
if(ch == '#') 
t = NULL;
   else
   {
t = (Bitree)malloc(sizeof(bitree));
t->data = ch;
t->lchild = Initiate();
t->rchild = Initiate();
   }
   return t;
}


//访问节点
void Visit(Bitree p)
{
printf("%c",p->data); //输出是char
}


//树的高度
int height(Bitree t)
{
int ld,rd;
if(t == NULL) 
return 0;
else 
{
ld = height(t->lchild);
rd = height(t->rchild);
return 1 + (ld>rd?ld:rd);
}
}
 
//层次遍历 
void LevelOrder(Bitree bt)
{
LKQue Q;
Bitree p;
InitQueue(&Q);
if(bt != NULL)
{
EnQueue(&Q,bt);
while(!EmptyQueue(&Q))
{
p = GetHead(&Q);
OutQueue(&Q);
Visit(p);
if(p->lchild != NULL)  
EnQueue(&Q,p->lchild);
if(p->rchild != NULL)  
EnQueue(&Q,p->rchild);
}
}
}


void main()
{
Bitree T;
printf("\n按先序序列输入结点序列,'#'代表空:");
T=Initiate();


printf("\n二叉树的高度为:%d\n",height(T));


printf("\n层次遍历序列为:");
LevelOrder(T);


printf("\n\n");

}

运行结果:


相关文章推荐

层次遍历二叉树-三种不同的方法

给定一棵二叉树,要求进行分层遍历,每层的节点值单独打印一行,下图给出事例结构: 对此二叉树遍历的结果应该是: 1, 2 , 3 4, 5, 6 7, 8 第一种方法,就是利用递归的...
  • zzran
  • zzran
  • 2013-04-09 16:26
  • 56702

C语言 二叉树的遍历 递归和(多种)非递归算法

//二叉树遍历 //作者:nuaazdh //时间:2011年12月1日 #include #include #define OK 1 #define ERROR...

C语言基本数据结构之二(二叉树的三种遍历,节点数以及深度算法)

关于二叉树的定义,网上有比较好的介绍,在这里就简单介绍二叉树的一些性质 二叉树的基本性质 1)二叉树的第i层上至多有 2^(i-1)(i ≥1)个结点; 2)深度为 h 的二叉树中至多含有 2^h –...

C语言实现二叉树的递归遍历与非递归遍历

本文实现了对二叉树的递归遍历和非递归遍历,当然还包括了一些栈操作。           二叉树的遍历本质上其实就是入栈出栈的问题,递归算法简单且容易理解,但是效率始终是个问题。非递归算法可以清楚的知...

数据结构——二叉树的遍历

“树”是一种重要的数据结构,本文浅谈二叉树的遍历问题,采用C语言描述。   一、二叉树基础 1)定义:有且仅有一个根结点,除根节点外,每个结点只有一个父结点,最多含有两个子节点,子节点有左右之分...

c语言-数据结构-二叉树-生成、遍历代码

1. 目标 生成一个二叉树,遍历输出二叉树中的内容,并显示所在的层级。 2. 运行示例 输入如下二叉树(前序遍历方式),不存在的子节点用空格代替。显示如下。 3. 源代码 需要的注意的...

C语言实现 前序、中序、后序遍历二叉树

1、代码实现#include #include /* 定义数据类型 */ typedef char TypeData ;/* 定义二叉树 */ typedef struct stBiTreeNode...

二叉树遍历及C语言实现

二叉树遍历及C语言实现已知中序和前序序列,或者已知中序和后序序列,都能够构造一棵二叉树。在本例中,本人用C语言写程序解答了下面两个算法题:(1)给出一棵二叉树的中序与后序遍历序列,求出它的先序遍历序列...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)