通过前序遍历的数组"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);
}
}