二叉树是数据结构中一种非常重要的结构,熟练的掌握二叉树的创建,遍历是打好编程基础的关键。对于遍历,不能仅仅只掌握递归遍历,还应掌握效率更高地非递归遍历。对于非递归的先序、中序、后序遍历要用到栈(在之前的博文中已经提到了具体的实现过程),而在层次遍历中要使用到另一种数据结构——队列,这个在之前博文中没有提到,因此在本篇博文中将会给出简单实现。
在本篇博文中给出的代码实现了:二叉树的创建、二叉树的递归、非递归的先、中、后序以及层次遍历七种遍历算法。话不多说,下面给出代码(仅供参考):
因为要用到栈和队列,因此在这代码一并给出,方便大家运行。
“LinkStack.h”:
"LinkQueue.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
#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(LinkQueue &Q, QueueElem e);
//出队列
void out_link_queue(LinkQueue &Q, QueueElem &e);
//队列是否为空
int is_queue_empty(LinkQ