在二叉树中,我们常见的遍历方式 主要有四种。分别是:
- 前序遍历(根节点->左节点->右节点)
- 中序遍历(左节点->根节点->右节点)
- 后序遍历(左节点->右节点->根节点)
- 层次遍历
其实记住以上的输出顺序还是非常简单的。首先要明白,左节点一定先比右节点输出!
那么就很好理解了,那么那些所谓的前序、中序、后序而言是针对根节点的相对位置命名的。
例如前序遍历,则就是根节点是最前面输出的,所以我们不难得到,前序遍历的顺序为:根节点->左节点->右节点。其他同理。
那么今天介绍下一种不同的方式—层次遍历。注意层次队列不能使用递归来完成,并且需要借助一个队列来帮我们完成整个过程的遍历!
#include <iostream>
#include <stdlib.h>
using namespace std;
#define ElemType char
#define maxSize 100
typedef struct Tree{
ElemType data;
struct Tree * rchild;
struct Tree * lchild;
}Tree,*Treep;
/*
采用前序遍历的思想创建二叉树
*/
void createTree(Tree * &p){
char c;
scanf("%c",&c);
if(c == ' '){
return;
}
p = (Tree *)malloc(sizeof(Tree));
p->data = c;
p->lchild = NULL;
p->rchild = NULL;
createTree(p->lchild);
createTree(p->rchild);
}
/*
该算法的主要思想是
1. 输出根节点的值
2. 把该节点的左孩子添加到队列
3. 把该节点的右孩子添加到队列
4. 从队列一一取出 重复上述步骤。
在遍历当前层次的时候,输出当前节点,并把下一层次
的节点按左右节点顺序存入队列。
队列的特点是:先进先出 那么这就很好的利用了队列的特点
达到了层次遍历的效果。
*/
void levelPrint(Tree * p){
//初始化一个非循环队列
Treep stack[maxSize];
int front,real;
front = real = 0;
Tree *curr ,*pre;
pre = p;
while(pre != NULL){
// 输出当前节点的值
cout<<pre->data;
// 拿到当前节点的左孩子指针
curr = pre->lchild;
//如果左孩子不为空 入队!
if(curr != NULL){
stack[real++] = curr;
}
// 如果右孩子不为空 入队!
curr = pre->rchild;
if(curr != NULL){
stack[real++] = curr;
}
// 如果队列不为空则从队列取出元素
if( front != real)
pre = stack[front++];
else //否则直接置空指针
pre = NULL;
}
}
int main(int argc, char** argv) {
Tree *root;
// 前序创建二叉树
createTree(root);
// 层次遍历二叉树
levelPrint(root);
return 0;
}