/*
******************************************************************************
/* <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); // 后序方式遍历二叉树
}