中序遍历二叉树的非递归算法

        花了一点时间,将书本上中序遍历二叉树的非递归算法的伪代码翻译成纯c的可执行程序,算法要结合栈和树的基本操作函数。程序在vc6.0下调试通过。

代码如下:

 

#include  < stdio.h >
#include 
< stdlib.h >
#define  STACK_INIT_SIZE 100
#define  STACKINCREMENT 10
#define  OVERFLOW -2
#define  INFEASIBLE -1
#define  ERROR 0
#define  OK 1
#define  TRUE 1
#define  FALSE 0

typedef 
int  TElemType;
TElemType Nil
= 0 ;
typedef 
struct  BiTNode 
{
    TElemType data;
    BiTNode 
*lchild,*rchild;
}
BiTNode, * BiTree;
typedef BiTree SElemType;//注意!栈中的元素类型是什么!
struct  SqStack
{
    SElemType 
*base;
    SElemType 
*top;
    
int stacksize;
}
;

int  InitStack(SqStack *  sq)
{
    sq
->base=(SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
    
if(!sq->base)exit(OVERFLOW);
    sq
->top=sq->base;
    sq
->stacksize=STACK_INIT_SIZE;
    
return OK;
}


int  Push(SqStack *  sq,BiTree bt)
{
    
if(sq->top-sq->base>=sq->stacksize)
    
{
        sq
->base=(SElemType*)realloc(sq->base,(sq->stacksize+STACKINCREMENT)*sizeof(SElemType));
        
if(!sq->base)exit(OVERFLOW);
        sq
->top=sq->base+sq->stacksize;
        sq
->stacksize+=STACKINCREMENT;
    }

    
*sq->top++=bt;
    
return OK;
}
// Push

int  Pop(SqStack *  sq,BiTree *  bt)
{
    
if(sq->base==sq->top)return ERROR;
      
*bt=*--sq->top;
    
return OK;
}
// Pop

int  StackEmpty(SqStack *  sq)
{
    
if(sq->base==sq->top)return OK;
    
else return ERROR;
}
// StackEmpty


int  InitBiTree(BiTree  * T)
{
    (
*T)=NULL;
    
return OK;
}


void  CreateBiTree(BiTree  * T)
{
    TElemType ch;
    
//BiTree *p;
    
//*p=*T;
    scanf("%d",&ch);
    
if(ch==Nil)
        (
*T)=NULL;
    
else
    
{
        (
*T)=(BiTree)malloc(sizeof(BiTNode));
        
if(!(*T))
            exit(OVERFLOW);
        (
*T)->data=ch;
        CreateBiTree(
&(*T)->lchild);
        CreateBiTree(
&(*T)->rchild);
    }

    
//return(*p);
}


int  BiTreeEmpty(BiTree  * T)
 
// 初始条件: 二叉树T存在
   
// 操作结果: 若T为空二叉树,则返回TRUE,否则FALSE
   if(*T)
     
return FALSE;
   
else
     
return TRUE;
 }


void  InOrder(BiTree *  root)
{/*中序遍历二叉树的非递归算法*/
    SqStack S;
    BiTree p;
    InitStack(
&S);
    p
=*root;
    
while(p!=NULL||!StackEmpty(&S))
    
{
        
if(p!=NULL)    //根指针进栈,遍历左子树
        {
            Push(
&S,p);
            p
=p->lchild;
        }

        
else
        
{/*根指针退栈,访问根节点,遍历右子树*/
            Pop(
&S,&p);
            printf(
"%d ",p->data);
            p
=p->rchild;  
        }

    }

}


void  main()
{
    BiTree T;
    InitBiTree(
&T);
    printf(
"请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树) ");
    CreateBiTree(
&T);
    printf(
"中序遍历输出结点的值:");
    InOrder(
&T);
    putchar(
' /n');
}
  • 4
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值