二叉树的先中后序的遍历方法就不多说了,根左右,左根右以及左右根。
我们今天讨论递归遍历,拿先序遍历举例。
首先讲一些预备知识。二叉树从一开始算节点,如果某一结点的位置为i,那么它的左右孩子节点分别为2*i ,2*i+1 ,他的双亲节点为 i/2 向下取整。
然后我们就可以开始使用递归读取二叉树。
输入一棵二叉树,为
7
1 2 3 0 0 0 0
我们先读根节点,然后再读根节点下左子树
接着读左子树的根节点,使用递归,知道节点数为0,我们开始读右节点
代码如下:
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 15 /* 存储空间初始分配量 */
#define MAX_TREE_SIZE 15 /* 二叉树的最大结点数 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int TElemType; /* 树结点的数据类型,目前暂定为整型 */
typedef TElemType SqBiTree[MAX_TREE_SIZE]; /* 0号单元存储根结点 */
typedef struct
{
int level,order; /* 结点的层,本层序号(按满二叉树计算) */
}Position;
TElemType Nil=0; /* 设整型以0为空 */
int nArray[15];
//---------------------------------------------------------------
/* 初始条件: 二叉树存在 */
/* 操作结果: 先序遍历T。 */
Status PreOrderTraverse(SqBiTree T, int e)
{
/********************begin*******************/
printf("%d ",T[e]);
if(T[2*e+1]!=Nil) {PreOrderTraverse(T,2*e+1);}
if(T[2*e+2]!=Nil) {PreOrderTraverse(T,e*2+2);}
/*********************end********************/
}
/* 初始条件: 二叉树存在 */
/* 操作结果: 中序遍历T。 */
Status InOrderTraverse(SqBiTree T, int e)
{
/********************begin*******************/
if(T[2*e+1]!=Nil) {InOrderTraverse(T,2*e+1);}
printf("%d ",T[e]);
if(T[2*e+2]!=Nil) {InOrderTraverse(T,e*2+2);}
/*********************end********************/
}
/* 初始条件: 二叉树T存在 */
/* 操作结果: 后序遍历T。 */
Status PostOrderTraverse(SqBiTree T, int e)
{
/********************begin*******************/
if(T[2*e+1]!=Nil) {PostOrderTraverse(T,2*e+1);}
if(T[2*e+2]!=Nil) {PostOrderTraverse(T,e*2+2);}
printf("%d ",T[e]);
/*********************end********************/
}
int main()
{
SqBiTree T;
int i,n; scanf("%d",&n);
int tmp;
for (i = 0; i < n; i++){
scanf("%d",&tmp);
T[i]=tmp;
}
for (; i < MAX_TREE_SIZE; i++)
T[i]=0;
printf("先序遍历二叉树:");
PreOrderTraverse(T, 0);
printf("\n中序遍历二叉树:");
InOrderTraverse(T, 0);
printf("\n后序遍历二叉树:");
PostOrderTraverse(T, 0);
return 0;
}