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

#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;
}

• 本文已收录于以下专栏：

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

• YaoDeBiAn
• 2016年06月07日 22:15
• 2565

## java数据结构--二叉树，递归遍历，非递归遍历，层次遍历

1.为什么要引入树    线性结构的特点是插入和删除速度慢，查找速度快。    链式结构的特点是查找速度慢，插入和删除速度快。       树型结构综合了线性结构和链式结构优点，查找，删除，插入速度都...
• ZuoAnYinXiang
• 2015年12月23日 23:09
• 1012

## c语言实现二叉树先序，中序，后序（递归），层次遍历，求叶子节点个数及树的深度，下一篇写非递归的遍历

#include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; stru...
• u014574317
• 2017年04月04日 14:50
• 1522

## 二叉树概念及递归与非递归遍历

• wangweixaut061
• 2012年01月04日 07:41
• 2367

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

• believe__dream
• 2015年04月28日 21:01
• 1677

## 如何实现二叉树层次遍历

• u014309268
• 2014年09月26日 22:47
• 3761

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

#include"iostream" #define maxsize 50 using namespace std; class node{ private: char data; node* l...
• u012651730
• 2013年11月19日 22:42
• 1311

## 二叉树的创建、二叉排序树、前序、中序、后序、层次遍历

package com.sun.example1; import java.util.LinkedList; import java.util.Queue; class Node { publi...
• sunshihua12829
• 2016年06月14日 19:38
• 870

## LintCode:二叉树的层次遍历 II

LintCode:二叉树的层次遍历 II""" Definition of TreeNode: class TreeNode: def __init__(self, val): ...
• u012225151
• 2016年05月13日 13:19
• 707

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

• u012099869
• 2015年08月21日 11:38
• 417

举报原因： 您举报文章：二叉树的递归遍历以及层次遍历 色情 政治 抄袭 广告 招聘 骂人 其他 (最多只允许输入30个字)