第3关:层次遍历二叉树

任务描述
相关知识
层次遍历二叉树
队列基本操作
编程要求
测试说明
任务描述
本关任务:给定一棵二叉树,借助队列实现层次遍历二叉树。

相关知识
为了完成本关任务,你需要掌握:1.二叉树层次遍历,2.队列基本操作。

层次遍历二叉树
层次遍历是从根结点出发,按照从上向下,同一层从左向右的次序访问所有的结点。采用层次遍历得到的访问结点序列称为层次遍历序列。

层次遍历序列的特点:其第一个元素值为二叉树中根结点值。

例:图1表示一个二叉树


图1的层次遍历顺序为节点上的数字,结果为:ABECDF

层次遍历二叉树算法思想:
用一个队列保存被访问的当前节点的左右孩子以实现层次遍历。

在进行层次遍历的时候,设置一个队列结构,首先将根节点指针入队列,遍历从二叉树的根节点开始:

从队头取出一个元素,访问该元素所指向的节点;
若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束。
队列基本操作
队列的数据元素类型如下:

typedef BiTNode * QElemType;
本关卡提供链队列linkqueue的相关操作和功能,链队列数据类型定义及相关操作函数接口定义如下,在进行二叉树的层次遍历的过程中,你可以根据需要调用以下操作。

typedef struct QNode
{
   QElemType data;
   QNode *next;
}*QueuePtr;
struct LinkQueue
{
   QueuePtr front,rear; // 队头、队尾指针
};
void InitQueue(LinkQueue &Q); // 构造一个空队列Q
void DestroyQueue(LinkQueue &Q); // 销毁队列Q,Q不再存在
void ClearQueue(LinkQueue &Q); // 将Q清为空队列
int QueueEmpty(LinkQueue Q); // 若队列Q为空队列,则返回TRUE;否则返回FALSE
int QueueLength(LinkQueue Q); // 返回Q的元素个数,即队列的长度
int GetHead(LinkQueue Q,QElemType &e); // 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR
int EnQueue(LinkQueue &Q,QElemType e); // 插入元素e为Q的新的队尾元素
int DeQueue(LinkQueue &Q,QElemType &e); // 若队列不空,则删除Q的队头元素,用e返回其值,并返回OK;否则返回ERROR
void QueueTraverse(LinkQueue Q,void(*vi)(QElemType)); // 从队头到队尾依次对队列
编程要求
本关的编程任务是补全右侧代码中Begin至End中间的代码,具体要求如下:

 void LevelOrderTraverse(BiTree T,void(*Visit)(TElemType));//层次遍历二叉树
测试说明
平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入:ABC##D##EF###
预期输出:层序遍历为:A,B,E,C,D,F,

测试输入:ABD##FE###CG#H##I##
预期输出:层序遍历为:A,B,C,D,F,G,I,E,H,

开始你的任务吧,祝你成功!

 #include <stdio.h>
#include <stdlib.h>

#include "bitree.h"

#include "linkqueue.h"


void LevelOrderTraverse(BiTree T,void(*Visit)(TElemType));


int main()
{
	BiTree T;	
	CreateBiTree(T);
	printf("层序遍历为:");
	LevelOrderTraverse(T,visit);
	DestoryBiTree(T);
	return 0;
}


void LevelOrderTraverse(BiTree T,void(*Visit)(TElemType))
 { // 初始条件:二叉树T存在,Visit是对结点操作的应用函数
   // 操作结果:层序递归遍历T(利用队列),对每个结点调用函数Visit一次且仅一次
    /********** Begin **********/ 
    if(T)
    {    
         LinkQueue tem;
         InitQueue(tem);
         EnQueue(tem,T); 
         while(!QueueEmpty(tem)){ 
         QElemType e;
         DeQueue(tem,e);
         Visit(e->data);
         if(e->lchild)
         EnQueue(tem,e->lchild);
         if(e->rchild)
              EnQueue(tem,e->rchild);
         }
         DestroyQueue(tem);
    }


    /********** End **********/
}





 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值