二叉树是数据结构中一种非常重要的结构,熟练的掌握二叉树的创建,遍历是打好编程基础的关键。对于遍历,不能仅仅只掌握递归遍历,还应掌握效率更高地非递归遍历。对于非递归的先序、中序、后序遍历要用到栈(在之前的博文中已经提到了具体的实现过程),而在层次遍历中要使用到另一种数据结构——队列,这个在之前博文中没有提到,因此在本篇博文中将会给出简单实现。
在本篇博文中给出的代码实现了:二叉树的创建、二叉树的递归、非递归的先、中、后序以及层次遍历七种遍历算法。话不多说,下面给出代码(仅供参考):
因为要用到栈和队列,因此在这代码一并给出,方便大家运行。
“LinkStack.h”:
#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include<stdlib.h>
#include<stdio.h>
#include"BiTree.h"
//定义栈中数据的类型
typedef BiTree LStackElem;
//定义栈元素的结构
typedef struct SNode
{
LStackElem data;
struct SNode * next;
}SNode, *LinkNode;
//定义栈的结构
typedef struct
{
LinkNode node; //栈顶指针(相当于链表中的头指针)
int size; //栈的大小
}LinkStack;
//初始化栈
void init_link_stack(LinkStack &S);
//进栈
void push(LinkStack &S, LStackElem e);
//出栈
void pop(LinkStack &S, LStackElem &e);
//判断栈是否为空
int is_stack_empty(LinkStack S);
//获得栈顶元素
void get_top(LinkStack S, LStackElem &e);
#endif
"LinkQueue.h":
#ifndef _LINKQUEUE_H
#define _LINKQUEUE_H
#include"BiTree.h"
typedef BiTree QueueElem;
typedef struct QNode
{
QueueElem data;
struct QNode * next;
}QNode;
typedef struct
{
QNode * top; //队列头指针
QNode * bottom; //队列尾指针
int size; //队列大小
}LinkQueue;
//初始化队列
void init_link_queue(LinkQueue &Q);
//入队列
void in_link_queue(LinkQueu