## Superior's Blog

There is no royal road to learning.

# 二叉树的递归遍历以及层次遍历

#include <stdio.h>
#include <stdlib.h>

#define ERROR 0
#define OK 1

typedef char TElemType;
typedef int Status;

//二叉树的二叉链表存储表示
typedef struct BiTNode
{
TElemType data;
struct BiTNode *lchild, *rchild;
}BiTNode, *BiTree;

//定义链式队列结点
typedef struct QNode
{
BiTree Queuedata;
struct QNode * next;
}QNode,* QueuePtr;
//定义链式队列
typedef struct
{
QueuePtr front;
QueuePtr rear;

//按照先序次序构造二叉树
Status CreatBiTree(BiTree &T)
{char ch;
scanf("%c",&ch);
if(ch=='#') T=NULL;
else
{
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
return ERROR;
T->data=ch;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
return OK;
}
//递归先序遍历二叉树
Status PreOrder ( BiTree T )
{
if ( T!=NULL)
{
printf("%c",T->data);
PreOrder ( T->lchild );
PreOrder ( T->rchild );
}
return OK;
}

//递归中序遍历二叉树
Status InOrder ( BiTree T )
{
if ( T!=NULL)
{
InOrder ( T->lchild );
printf("%c",T->data);
InOrder ( T->rchild );
}
return OK;
}

//递归后序遍历二叉树
Status LastOrder ( BiTree T )
{
if (T!=NULL)
{
LastOrder( T->lchild );
LastOrder( T->rchild );
printf("%c",T->data);
}
return OK;
}

//初始化一个带头结点的队列
{
Q.front=(QNode*)malloc(sizeof(QNode));
if (!Q.front)
return ERROR;
Q.rear=Q.front;
Q.front->next=NULL;
return OK;
}

//入队列
{
QueuePtr s=(QueuePtr)malloc(sizeof(QNode));
if (!s)
return ERROR;
s->Queuedata=e;
s->next=NULL;
Q.rear->next=s;
Q.rear=s;
return OK;

}
//出队
{
char data1;
QueuePtr s;
s=Q.front->next;
e=s->Queuedata;
data1=e->data;
Q.front->next=s->next;
if(Q.rear==s)
Q.rear=Q.front;
free(s);

return OK;
}
//队列的判断空操作
{

if (Q.front->next==NULL)
return OK;
else return ERROR;

}
//按层次遍历
Status LevelBiTree(BiTree T)
{

InitQueue(Q);
BiTree p = T;
if (T == NULL) return ERROR;

EnQueue(Q,p);

while (!QueueEmpty(Q))
{   DelQueue(Q, p);
printf("%C",p->data);

if (p->lchild)
EnQueue(Q, p->lchild);
if (p->rchild)
EnQueue(Q, p->rchild);
}

return OK;
}

int main()
{BiTree T;
printf("按照先序次序输入二叉树中结点的值.\n");
CreatBiTree(T);
printf("先序遍历二叉树:");
PreOrder(T);printf("\n");
printf("中序遍历二叉树:");
InOrder(T);printf("\n");
printf("后序遍历二叉树:");
LastOrder(T);printf("\n");
printf("按层次遍历二叉树:");
LevelBiTree(T);printf("\n");
return 0;
}

#### 二叉树递归非递归遍历（递归前中后，非递归前中后，层次遍历，凹入打印法等）

2016-05-30 21:28:04

#### 二叉树遍历（先中后序 递归和非递归+层次遍历）java代码 可直接运行

2016-12-03 18:34:06

#### 二叉树按层次遍历的递归用法

2016-06-07 22:15:32

#### 计算二叉树宽度——层次遍历

2015-04-28 21:01:18

#### 二叉树的先序创建，先序，中序，后序的递归与非递归遍历，层次遍历，叶子结点数及树的深度

2013-11-13 22:45:08

#### 二叉树的递归遍历、非递归遍历和层次遍历

2011年11月30日 789KB 下载

#### （C语言版）二叉树遍历算法——包含递归前、中、后序和层次，非递归前、中、后序和层次遍历共八种

2014-03-18 14:08:38

#### 实现二叉树的先序遍历、中序遍历、后序遍历的递归非递归算法以及层次遍历算法

2013-11-19 22:42:15

#### 层次遍历的两种方式：递归与迭代

2015-08-21 11:38:27