《数据结构》二叉树递归遍历

 

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值