c/c++实现实现二叉树前序,中序和后序的递归和非递归遍历
#include<stdio.h>
#include<stdlib.h>#include<seqstack.h>//import self-defined stack
typedef char DataType;
typedef struct bnode{
DataType data;
struct bonde *lchild,*rchild;
}Bnode,*BTree;
//this struct definition is for PostOrder
typedef struct{
BTree node;
int flag;
}DNode;
void PreOrder(BTree t)//recursion
{
if(t)
{
visit(t->data);
PreOrder(t->lchild);
PreOrder(t->rchild);
}
}
void PreOrder(BTree t)//use stack
{
PSeqStack p;
BTree bt=t;
p=init_SeqStack();
while(bt || !isEmpty_SeqStack(p))
{
if(bt)
{
visit(bt->data);
push_SeqStack(p,bt);
bt=bt->lchild;
}
else
{
pop_SeqStack(p,&bt);
bt=bt->rchild;
}
}
}
void InOrder(BTree t)//recursion
{
if(t)
{
InOrder(t->lchild);
visit(t->data);
InOrder(t->rchild);
}
}
void InOrder(BTree t)//use stack
{
PSeqStack p;
BTree bt=t;
p=init_SeqStack();
while(bt || !isEmpty_SeqStack(p))
{
if(bt)
{
push_SeqStack(p,bt);
bt=bt->lchild;
}
else
{
pop_SeqStack(p,&bt);
visit(bt->data);
bt=bt->rchild;
}
}
}
void PostOrder(BTree t)//recursion
{
if(t)
{
PostOrder(t->lchild);
PostOrder(t->rchild);
visit(t->data);
}
}
void PostOrder(BTree t)//use stack
{
PSeqStack p;
DNode dn;
BTree bt=t;
p=init_SeqStack();
while(bt || !isEmpty_SeqStack(p))
{
if(bt)
{
dn.flag=0;
dn.node=bt;
push_SeqStack(p,dn);
bt=bt->lchild;
}
else
{
pop_SeqStack(p,&dn);
bt=dn.node;
if(dn.flag==0)
{
dn.flag=1;
push_SeqStack(p,dn);
bt=bt->rchild;
}
else
{
visit(bt->data);
bt=NULL;
}
}
}
}