二叉树的层序遍历

43 篇文章 1 订阅

通过前序遍历的数组"ABD##GI##J###CE#HK###F##"构建二叉树

通过前序遍历的数组"ABD##GI##J###CE#HK###F##"构建二叉树,并得到二叉树的前序遍历,中序遍历,后序遍历

二叉树的层序遍历需要借助于队列,而队列又由单链表实现
对无头单向非循环链表的回顾

源文件 BTree.c

//层序遍历,层序遍历需要借助队列(队列由单链表实现)
void BinaryTreeLevelOrder(BTNode* root){
Queue qu;
BTNode* cur;

	QueueInit(&qu);

	QueuePush(&qu, root);

	while (!QueueIsEmpty(&qu)){
		
		cur = QueueTop(&qu);
		
		putchar(cur->data);
		
		if (cur->lchild){
			QueuePush(&qu, cur->lchild);
		}
		if (cur->rchild){
			QueuePush(&qu, cur->rchild);
		}
		QueuePop(&qu);
	}
	QueueDestory(&qu);
}

其中队列的实现分为以下步骤

头文件 Queue.h

#ifndef _Queue_H
#define _Queue_H
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <malloc.h>
#include "BTree.h"

typedef BTNode * QuDataType;

typedef struct QueueNode{
	QuDataType _data;
	struct QueueNode* _next;
}QueueNode;

typedef struct Queue{
	QueueNode* _head;
	QueueNode* _rear;
}Queue;

//初始化函数
void QueueInit(Queue* plist);

//对应于初始化函数,需要释放开辟的动态内存
void QueueDestory(Queue* plist);

//队列中插入数据(队列头)
void QueuePush(Queue* plist, QuDataType x);
//删除队列中的数据(队列尾)
void QueuePop(Queue* plist);

//返回队列头的数据
QuDataType QueueTop(Queue* plist);

//判断队列是否为空
int QueueIsEmpty(Queue* plist);

//打印链表
void QueuePrint(Queue* plist);


#endif //_Queue_H

函数实现源文件 Queue.c

#include "Queue.h"
#include "BTree.h"

//初始化函数
void QueueInit(Queue* plist){
	assert(plist);
	plist->_head = NULL;
	plist->_rear = NULL;
}

//判断队列是否为空
int QueueIsEmpty(Queue* plist){
	return plist->_head == NULL;
}

//队列中插入数据(队列尾入)
void QueuePush(Queue* plist, QuDataType x){
	QueueNode* cur = (QueueNode*)malloc(sizeof(QueueNode));
	cur->_data = x;
	cur->_next = NULL;
	if (QueueIsEmpty(plist)){
		plist->_head = plist->_rear = cur;
	}
	plist->_rear->_next = cur;
	plist->_rear = cur;
}

//删除队列中的数据(队列头出)
void QueuePop(Queue* plist){
	assert(plist);
	QueueNode* tmp;
	if (plist->_head){
		tmp = plist->_head;
		plist->_head = plist->_head->_next;
		free(tmp);
	}
}

//返回队列头的数据
QuDataType QueueTop(Queue* plist){
	if (QueueIsEmpty(plist)){
		return (QuDataType)0;
	}
	return plist->_head->_data;
}

//对应于初始化函数,需要释放开辟的动态内存
void QueueDestory(Queue* plist){
	assert(plist);
	QueueNode* tmp;
	while (plist->_head){
		tmp = plist->_head;
		plist->_head = plist->_head->_next;
		free(tmp);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值