/*******************************************************************************
/* <PRE>
/* 版权所有 : -
/* 模块名 : 树
/* 文件名 : btree.cpp
/* 功能描述 : 二叉树的递归遍历
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : 输入示例与输出结果
/*
/* e.g. input : ABD###CE#F###
/* bi-tree :
/* A
/* / \
/* B C
/* / /
/* D E
/* \
/* F
/*
/* pre-order traverse: A B D C E F
/* in-order traverse: D B A E F C
/* post-order traverse: D B F E C A
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int TElemType;
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
/* 二叉树的链式存储结构 */
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
} BiTNode, *BiTree;
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status Visit(TElemType e);
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType));
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType));
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType));
/*******************************************************************************
/* <FUNC>
/* 函数名 : Visit
/* 功能 : 打印节点数据
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Visit(TElemType e)
{
printf("%c", e);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : PreOrderTraverse
/* 功能 : 前序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(Visit(T->data))
if(PreOrderTraverse(T->lchild, Visit))
if(PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : InOrderTraverse
/* 功能 : 中序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(InOrderTraverse(T->lchild, Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : PostOrderTraverse
/* 功能 : 后序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(PostOrderTraverse(T->lchild, Visit))
if(PostOrderTraverse(T->rchild, Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : CreateBiTree
/* 功能 : 创建二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 前序方式创建
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status CreateBiTree(BiTree &T)
{
char ch = getchar();
if('#' == ch) T = NULL;
else {
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
BiTree T;
CreateBiTree(T);
printf("Pre Order Traverse: ");
PreOrderTraverse(T, Visit); //前序方式遍历二叉树
printf("\nIn Order Traverse: ");
InOrderTraverse(T, Visit); //中序方式遍历二叉树
printf("\nPost Order Traverse: ");
PostOrderTraverse(T, Visit); //后序方式遍历二叉树
}
/* <PRE>
/* 版权所有 : -
/* 模块名 : 树
/* 文件名 : btree.cpp
/* 功能描述 : 二叉树的递归遍历
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : 输入示例与输出结果
/*
/* e.g. input : ABD###CE#F###
/* bi-tree :
/* A
/* / \
/* B C
/* / /
/* D E
/* \
/* F
/*
/* pre-order traverse: A B D C E F
/* in-order traverse: D B A E F C
/* post-order traverse: D B F E C A
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
#define OK 1
#define ERROR 0
#define OVERFLOW -2
typedef int Status;
typedef int TElemType;
/******************************************************************************
/* 数据结构声明
/******************************************************************************/
/* 二叉树的链式存储结构 */
typedef struct BiTNode {
TElemType data;
struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
} BiTNode, *BiTree;
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status Visit(TElemType e);
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType));
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType));
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType));
/*******************************************************************************
/* <FUNC>
/* 函数名 : Visit
/* 功能 : 打印节点数据
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status Visit(TElemType e)
{
printf("%c", e);
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : PreOrderTraverse
/* 功能 : 前序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status PreOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(Visit(T->data))
if(PreOrderTraverse(T->lchild, Visit))
if(PreOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : InOrderTraverse
/* 功能 : 中序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(InOrderTraverse(T->lchild, Visit))
if(Visit(T->data))
if(InOrderTraverse(T->rchild, Visit))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : PostOrderTraverse
/* 功能 : 后序遍历二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 递归法
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status PostOrderTraverse(BiTree T, Status (*Visit)(TElemType))
{
if(T){
if(PostOrderTraverse(T->lchild, Visit))
if(PostOrderTraverse(T->rchild, Visit))
if(Visit(T->data))
return OK;
return ERROR;
}
else
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : CreateBiTree
/* 功能 : 创建二叉树
/* 参数 : -
/* 返回值 : -
/* 备注 : 前序方式创建
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status CreateBiTree(BiTree &T)
{
char ch = getchar();
if('#' == ch) T = NULL;
else {
if(!(T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data = ch; //生成根结点
CreateBiTree(T->lchild); //构造左子树
CreateBiTree(T->rchild); //构造右子树
}
return OK;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
BiTree T;
CreateBiTree(T);
printf("Pre Order Traverse: ");
PreOrderTraverse(T, Visit); //前序方式遍历二叉树
printf("\nIn Order Traverse: ");
InOrderTraverse(T, Visit); //中序方式遍历二叉树
printf("\nPost Order Traverse: ");
PostOrderTraverse(T, Visit); //后序方式遍历二叉树
}