配色: 字号:
c语言版本二叉树基本操作示例(先序 递归 非递归)
2016-12-27 | 阅:  转:  |  分享 
  
c语言版本二叉树基本操作示例(先序递归非递归)



这篇文章主要介绍了实现二叉树的创建(先序)、递归及非递归的先、中、后序遍历



复制代码代码如下:



请按先序遍历输入二叉树元素(每个结点一个字符,空结点为''=''):

ABD==E==CF==G==



先序递归遍历:

ABDECFG

中序递归遍历:

DBEAFCG

后序递归遍历:

DEBFGCA

层序递归遍历:

ABCDEFG

先序非递归遍历:

ABDECFG

中序非递归遍历:

DBEAFCG

后序非递归遍历:

DEBFGCA

深度:

请按任意键继续...



复制代码代码如下:





#include

#include



#defineOK1

#defineERROR0

#defineTRUE1

#defineFALSE0

#defineOVERFLOW-1



#defineSTACK_INIT_SIZE100

#defineSTACKINCREMENT10



typedefintStatus;



typedefcharElemType;

typedefstructBTNode

{

ElemTypedata;

structBTNodeleftChild;

structBTNoderightChild;

}BTNode,BinTree;



typedefBinTreeSElemType;



typedefstruct{//栈结构定义

SElemTypebase;

SElemTypetop;

intstacksize;

}SqStack;



BinTreeCreateBinTree(BinTreeT);

StatusVisit(ElemTypee);

StatusDepth(BinTreeT);

StatusPreOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));

StatusInOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));

StatusPostOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));

StatusLevelOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));



//定义栈的相关操作

StatusInitStack(SqStackS);

StatusDestroyStack(SqStackS);

StatusClearStack(SqStackS);

StatusStackEmpty(SqStackS);

intStackLength(SqStackS);

StatusGetTop(SqStackS,SElemTypee);

StatusPush(SqStackS,SElemTypee);

StatusPop(SqStackS,SElemTypee);

StatusStackTraverse(constSqStackS);



StatusPreOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));

StatusInOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));

StatusPostOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee));



intmain()

{

intdepth;

BinTreeTree=NULL;

Status(visit)(ElemTypee)=Visit;

printf_s("请按先序遍历输入二叉树元素(每个结点一个字符,空结点为''=''):\n");

Tree=CreateBinTree(Tree);



printf_s("\n先序递归遍历:\n");

PreOrderRecursionTraverse(Tree,visit);

printf_s("\n中序递归遍历:\n");

InOrderRecursionTraverse(Tree,visit);

printf_s("\n后序递归遍历:\n");

PostOrderRecursionTraverse(Tree,visit);

printf_s("\n层序递归遍历:\n");

LevelOrderRecursionTraverse(Tree,visit);



printf_s("\n先序非递归遍历:\n");

PreOrderNoneRecursionTraverse(Tree,visit);

printf_s("\n中序非递归遍历:\n");

InOrderNoneRecursionTraverse(Tree,visit);

printf_s("\n后序非递归遍历:\n");

PostOrderNoneRecursionTraverse(Tree,visit);



printf_s("\n深度:\n");

depth=Depth(Tree);

printf_s("%d\n",depth);

system("pause");

return0;

}



//创建二叉树

BinTreeCreateBinTree(BinTreeT)

{

charch;

scanf_s("%c",&ch);

if(ch==''='')

{

T=NULL;

}

else

{

if(!(T=(BTNode)malloc(sizeof(BTNode))))

{

exit(OVERFLOW);

}

T->data=ch;//生成根结点

T->leftChild=CreateBinTree(T->leftChild);

T->rightChild=CreateBinTree(T->rightChild);

}

returnT;

}



//访问二叉树

StatusVisit(ElemTypee)

{

if(e==''\0'')

{

returnERROR;

}

else

{

printf_s("%c",e);

}

returnOK;

}



//先序遍历递归算法

StatusPreOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

if(T)

{

if(!Visit(T->data))

{

returnERROR;

}

PreOrderRecursionTraverse(T->leftChild,Visit);

PreOrderRecursionTraverse(T->rightChild,Visit);

}

returnOK;

}



//中序遍历递归算法

StatusInOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

if(T)

{

InOrderRecursionTraverse(T->leftChild,Visit);

if(!Visit(T->data))

{

returnERROR;

}

InOrderRecursionTraverse(T->rightChild,Visit);

}

returnOK;

}



//后序遍历递归算法

StatusPostOrderRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

if(T)

{

PostOrderRecursionTraverse(T->leftChild,Visit);

PostOrderRecursionTraverse(T->rightChild,Visit);

if(!Visit(T->data))

{

returnERROR;

}

}

returnOK;

}



//层序遍历递归算法

StatusLevelOrderRecursionTraverse(BinTreeT,Status(Visitwww.visa158.com)(ElemTypee))

{

if(T)

{

BTNodeQ[100];//假设不溢出

intfront=-1,rear=-1;

if(T)

{

Q[++rear]=T;

printf_s("%c",T->data);

while(front!=rear)

{

BTNodep;

if(!(p=(BTNode)malloc(sizeof(BTNode))))

{

exit(OVERFLOW);

}

p=Q[++front];

if(p->leftChild)

{

Q[++rear]=p->leftChild;

printf("%c",p->leftChild->data);

}

if(p->rightChild)

{

Q[++rear]=p->rightChild;

printf("%c",p->rightChild->data);

}

}

}

}

returnOK;

}



StatusDepth(BinTreeT)

{

inta,b;

if(!T)

{

returnERROR;

}

else

{

a=Depth(T->leftChild)+1;

b=Depth(T->rightChild)+1;

returnawww.hunanwang.net>b?a:b;

}

}



//先序遍历非递归算法

StatusPreOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

SqStackS;

SElemTypep;



InitStack(&S);

Push(&S,T);



while(!StackEmpty(S))

{

Pop(&S,&p);

if(!Visit(p->data))

{

returnERROR;

}

if(p->leftChild)

{

Push(&S,p->rightChild);

}

if(p->rightChild)

{

Push(&S,p->leftChild);

}

}

DestroyStack(&S);

returnOK;

}



//中序遍历非递归算法

StatusInOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

SqStackS;

SElemTypep;



InitStack(&S);

Push(&S,T);

while(!StackEmpty(S))

{

while(GetTop(S,&p)&&p)

{

Push(&S,p->leftChild);

}

Pop(&S,&p);

if(!StackEmpty(S))

{

Pop(&S,&p);

if(!Visit(p->data))

{

returnERROR;

}

Push(&S,p->rightChild);

}

}

DestroyStack(&S);

returnOK;

}



//后序便利非递归算法

StatusPostOrderNoneRecursionTraverse(BinTreeT,Status(Visit)(ElemTypee))

{

SqStackS;

SElemTypep,q;

InitStack(&S);

Push(&S,T);

while(!StackEmpty(S))

{

while(GetTop(S,&p)&&p&&(p->leftChild||p->rightChild))

{

Push(&S,p->rightChild);

Push(&S,p->leftChild);

}

if(!StackEmpty(S)){

Pop(&S,&p);

if(p)

{

if(!Visit(p->data))

{

returnERROR;

}

}

else

{

Pop(&S,&p);

if(!Visit(p->data))

{

returnERROR;

}

}

while(GetTop(S,&q)&&q&&p==q->rightChild)

{

Pop(&S,&p);

if(!Visit(p->data))

{

returnERROR;

}

GetTop(S,&q);

}

}

}

DestroyStack(&S);

returnOK;

}



//-----------栈的相关操作--------------//

StatusInitStack(SqStackS){

S->base=(SElemType)malloc(STACK_INIT_SIZEsizeof(SElemType));

if(!S->base)

{

exit(0);

}

S->top=S->base;

S->stacksize=STACK_INIT_SIZE;

returnOK;

}



StatusDestroyStack(SqStackS){

if(!S)

{

exit(0);

}

free(S->base);

returnOK;

}



StatusClearStack(SqStackS){

if(!S)

{

returnFALSE;

}

S->top=S->base;

returnOK;

}



StatusStackEmpty(SqStackS){

if(S.top==S.base)

{

returnTRUE;

}

else

{

returnFALSE;

}

}



intStackLength(SqStackS){

returnS.stacksize;

}



StatusGetTop(SqStackS,SElemTypee){

if(S.top==S.base)

{

returnFALSE;

}

else

{

e=(S.top-1);

returnOK;

}

}



StatusPush(SqStackS,SElemTypee){

if(S->top-S->base>=S->stacksize)

{

S->base=(SElemType)realloc(S->base,(S->stacksize+STACKINCREMENT)sizeof(SElemType));

if(!S->base)

{

exit(0);

}

S->top=S->base+S->stacksize;

S->stacksize+=STACKINCREMENT;

}

S->top++=e;

returnOK;

}



StatusPop(SqStackS,SElemTypee){

if(S->top==S->base)

{

returnERROR;

}

e=(--S->top);

returnOK;

}





















献花(0)
+1
(本文系白狐一梦首藏)