(原创)遍历二叉树

本文介绍了一种非递归方式实现二叉树的中序遍历算法,并给出了完整的C语言代码实现。该算法基于严尉敏《数据结构》一书中的相关内容,适用于计算机科学与技术领域的学习者。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以后程序写完保存在这里。

根据严尉敏的<数据结构>第6章的算法而来,非递归二叉树只有中序,根据第130页算法 。

 

#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;

typedef 
struct 
{
    BiTree 
base;
    BiTree top;
    
int stacksize;
}
 SqStack;

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;
}


Status InitStack(SqStack 
&T)
{
    T.
base=(BiTNode *)malloc(STACK_INIT_SIZE*sizeof(BiTNode));
    
if(!T.base)
        
return(OVERFLOW);
    T.top
=T.base;
    T.stacksize
=STACK_INIT_SIZE;
    
return OK;
}
//InitStack

Status StackEmpty(SqStack S)
{
    
if(S.base==S.top)
        
return TRUE;
    
else
        
return FALSE;
}
//StackEmpty

Status GetTop(SqStack S,BiTree 
&e)
{
    
if(S.top==S.base)
        
return ERROR;
    S.top
=S.top-1;
    e
=S.top;
    S.top
++;
    
return OK;
}
//GetTop

Status Push(SqStack 
&S,BiTNode e)
{
    
if(S.top-S.base>=S.stacksize)
    
{
        S.
base=(BiTNode *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(BiTNode));
        
if(!S.basereturn(OVERFLOW);
        S.top
=S.base+S.stacksize;
        S.stacksize
=S.stacksize+STACKINCREMENT;
    }

    
*(S.top)=e;
    S.top
++;
    
return OK;
}
//Push

Status Pop(SqStack 
&S,BiTree &e)
{
    
if(S.top==S.basereturn(ERROR);
    S.top
--;
    e
=S.top;
    
return(OK);
}
//Pop

Status InOrderTraverseStack(BiTree T,Status(
* Visit)(TElemType e))
{
    SqStack S;
    InitStack(S);BiTree p;
    p
=T;
    
while(p||!StackEmpty(S))
    
{
        
if(p)
        
{
            Push(S,
*p);
            p
=p->lchild;
        }

        
else
        
{
            Pop(S,p);
//p=S.top;
            if(!Visit(p->data)) return ERROR;
            p
=p->rchild;
        }

    }

    
return(OK);
}


Status InOrderTraverse_621(BiTree T,Status(
* Visit)(TElemType e))
{
    SqStack S;
    InitStack(S);BiTree p;Push(S,
*T);p=T;
    
while(!StackEmpty(S))
    
{
        
while(p->lchild)
        
{
            Push(S,
*(p->lchild));
            GetTop(S,p);
        }

        
if(!StackEmpty(S))
        
{
            Pop(S,p);
            
if(!Visit(p->data))
                
return ERROR;
            
if(p->rchild)
                Push(S,
*(p->rchild));
        }

    }

    
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. ");
    InOrderTraverseStack(T,PrintElement);printf(
"___InOrderTraverseStack Complete. ");
    InOrderTraverse_621(T,PrintElement);printf(
"___InOrderTraverse_621 Complete. ");
    
return 1;
}

/*运行结果,abc##de#g##f###
CreateBiTree succeed at a
CreateBiTree succeed at b
CreateBiTree succeed at c
CreateBiTree succeed at d
CreateBiTree succeed at e
CreateBiTree succeed at g
CreateBiTree succeed at f
CreateBiTree Succeed!
_a__b__c__d__e__g__f____PreOrderTraverse Complete.
_c__b__e__g__d__f__a____InOrderTraverse Complete.
_c__g__e__f__d__b__a____PostOrderTraverse Complete.
_c__b__e__g__d__f__a____InOrderTraverseStack Complete.
_c__b__e__g__d__f__a____InOrderTraverse_621 Complete.
Press any key to continue
另一个运行结果:
-+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__f____PreOrderTraverse Complete.
_a__+__b__*__c__-__d__-__e__/__f____InOrderTraverse Complete.
_a__b__c__d__-__*__+__e__f__/__-____PostOrderTraverse Complete.
_a__+__b__*__c__-__d__-__e__/__f____InOrderTraverseStack Complete.
_a__+__b__*__c__-__d__-__e__/__f____InOrderTraverse_621 Complete.
Press any key to continue
*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值