中序遍历二叉树

根据严蔚敏教材第130页的算法而来,可直接运行,在VC6中调试通过.

 

#include  < stdio.h >
#include 
< process.h >
#include 
< stdarg.h >
#include 
< stdlib.h >
#include 
< malloc.h >

#define 
NULL   0
#define MAXNODE 
100
#define OVERFLOW 
- 2
#define OK 
1
#define 
TRUE   1
#define 
FALSE   0
#define 
ERROR   - 1
#define STACK_INIT_SIZE 
100
#define STACKINCREMENT 
10

typedef char TElemType;
typedef 
int  Status;

typedef struct BiTNode
{
    TElemType data;
    struct BiTNode 
* lchild, * rchild;
} BiTNode,
* BiTree;

Status PrintElement(TElemType e)
{
    printf(
"  %c " ,e);
    return OK;
}

Status NewTree(BiTree 
& T)
{
    T
= (BiTree)malloc(sizeof(BiTNode));T -> data = ' #';
    T -> lchild = NULL ;
    T
-> rchild = NULL ;
    return OK;
}

Status CreateBiTree(BiTree 
& T)
{
    TElemType ch;
    scanf(
" %c " , & ch);
    
if (ch == ' #') T=NULL;
     else
    {
           
if (!(T = (BiTNode  * )malloc(sizeof(BiTNode)))) 
            return(OVERFLOW);
        T
-> data = ch;
        printf(
" CreateBiTree succeed at %c " ,ch);
        CreateBiTree(T
-> lchild);
        CreateBiTree(T
-> rchild);
    }
    return OK;
}
// CreateBiTree

Status PreOrderTraverse(BiTree T,Status(
*  Visit)(TElemType e))
{
    
if (T)
    {
        
if (Visit(T -> data))
        
if (PreOrderTraverse(T -> lchild,Visit))
            
if (PreOrderTraverse(T -> rchild,Visit))
                return OK;
        return 
ERROR ;
    }
    return OK;
}

Status InOrderTraverse(BiTree T,Status(
*  Visit)(TElemType e))
{
    
if (T)
    {
        
if (InOrderTraverse(T -> lchild,Visit))
            
if (Visit(T -> data))
                
if (InOrderTraverse(T -> rchild,Visit))
                    return(OK);
        return(
ERROR );
    }
    return OK;
}

Status PostOrderTraverse(BiTree T,Status(
*  Visit)(TElemType e))
{
    
if (T)
    {
        
if (PostOrderTraverse(T -> lchild,Visit))
            
if (PostOrderTraverse(T -> rchild,Visit))
                
if (Visit(T -> data))
                    return OK;
        return 
ERROR ;
    }
    return OK;
}

int  main()
{
    BiTree T,S;
    NewTree(T);
    CreateBiTree(T);
    printf(
" CreateBiTree Succeed! " );
    PreOrderTraverse(T,PrintElement);printf(
" PreOrderTraverse Complete. " );
    InOrderTraverse(T,PrintElement);printf(
" InOrderTraverse Complete. " );
    PostOrderTraverse(T,PrintElement);printf(
" PostOrderTraverse Complete. " );
    return 
1 ;
}
/* 运行结果:输入
-+ a## * b## - c##d## / e##f##
CreateBiTree succeed at 
-
CreateBiTree succeed at 
+
CreateBiTree succeed at a
CreateBiTree succeed at 
*
CreateBiTree succeed at b
CreateBiTree succeed at 
-
CreateBiTree succeed at c
CreateBiTree succeed at d
CreateBiTree succeed at 
/
CreateBiTree succeed at e
CreateBiTree succeed at f
CreateBiTree Succeed!
 
-   +  a  *  b  -  c d  /  e fPreOrderTraverse Complete.
 a 
+  b  *  c  -  d  -  e  /  fInOrderTraverse Complete.
 a b c d 
-   *   +  e f  /   - PostOrderTraverse Complete.
Press any key 
to  continue */
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值