先序遍历:若二叉树为空,则空操作;否则访问根节点;先序遍历左子树;先序遍历右子树。
中序遍历:若二叉树为空,则空操作;否则中序遍历左子树;访问根节点;中序遍历右子树。
/*
* Created by Microsoft Visual Studio 2013
* @author: Teresa
* @date: 2017-10-20
* @description: 二叉树遍历 递归
*/
#include <stdio.h>
#include <stdlib.h>
/*函数状态码*/
#define TRUE 1 //成功
#define OK 1
#define FALSE 0 //失败
#define ERROR 0 //错误
#define INFEASIBLE -1 //不可行的
#define OVERFLOW -2 //溢出
typedef int Status; //函数的返回值类型
//二叉树的二叉链表存储表示
typedef char TElemType;
typedef struct BiNode
{
TElemType data;
struct BiNode *lchild, *rchild;
} BiNode , *BiTree;
//按先序次序输入二叉树中结点的值(一个字符),空格字符表示空树,构造二叉链表表示的二叉树T。
Status CreatBiTree(BiTree *T)
{
char ch;
scanf("%c", &ch);
//如果当前输入的字符为空格,则(*T)指向空树。
if (ch == ' ')
{
(*T) = NULL;
}
else
{
if (!((*T) = (BiTree)malloc(sizeof(BiNode))))
exit(OVERFLOW);
(*T)->data = ch; //生成根结点
CreatBiTree(&((*T)->lchild)); //构造左子树
CreatBiTree(&((*T)->rchild)); //构造右子树
}
return OK;
}
//采用二叉链表存储结构,Visit是对数据元素操作的应用函数,
//先序遍历二叉树T的递归算法,对每个数据元素调用函数Visit。
Status PreOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
if (T)
{
if (Visit(T->data))
if (PreOrderTraverse_Recursive(T->lchild, Visit))
if (PreOrderTraverse_Recursive(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK; //当T为空树时,停止递归。
}
//中序遍历 递归实现
Status InOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
if (T)
{
if (InOrderTraverse_Recursive(T->lchild, Visit))
if (Visit(T->data))
if (InOrderTraverse_Recursive(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
//后序遍历 递归实现
Status PostOrderTraverse_Recursive(BiTree T, Status(*Visit)(TElemType e))
{
if (T)
{
if (PostOrderTraverse_Recursive(T->lchild, Visit))
if (PostOrderTraverse_Recursive(T->rchild, Visit))
if (Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}
//遍历数据元素时所调用函数
Status PrintElement(TElemType e)
{
putchar(e);
return OK;
}
int main()
{
BiTree T;
CreatBiTree(&T);
//先序
printf("先序:\n");
PreOrderTraverse_Recursive(T, PrintElement);
printf("\n");
//中序
printf("中序:\n");
InOrderTraverse_Recursive(T, PrintElement);
printf("\n");
//后序
printf("后序:\n");
PostOrderTraverse_Recursive(T, PrintElement);
printf("\n");
system("pause");
return 0;
}