二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的。对于二叉树,有前序、中序以及后序三种遍历方法。因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易理解而且代码很简洁。而对于树的遍历若采用非递归的方法,就要采用栈去模拟实现。在三种遍历中,前序和中序遍历的非递归算法都很容易实现,非递归后序遍历实现起来相对来说要难一点。
这里用的是我自己实现的栈结构纯C语言实现,有需要的同学可自行更改源码
typedef int TElemType;
typedef struct BiTNode{
TElemType data ;
struct BiTNode * lchild, * rchild;
}BiTNode, * BiTree;
int CreateBiTree(BiTree &T)
{
char ch;
scanf("%c",&ch);
if(ch == '#') T = NULL;
else{
if(!(T = (BiTNode *)malloc(sizeof(BiTNode))))
return 0;
T->data = ch; //生成根节点
CreateBiTree(T->lchild); //生成左子树
CreateBiTree(T->rchild); //生成右子树
}
return 1;
}
void visit(TElemType e)
{
printf("%c",e);
}
//中序非递归遍历二叉树
int InOrderTraverse(BiTree T,void (* visit)(TElemType e))
{
SqStack S;
InitStack(S);
Push(S,T);//根指针入栈
BiTree p;
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p) Push(S,p->lchild);
Pop(S,p);//删除空节点
if(!StackEmpty(S))
{
Pop(S,p);
visit(p->data);
Push(S,p->rchild);
}
}
return 1;
}
//先序非递归遍历
int PreOrderTraverse(BiTree T,void (* visit)(TElemType e))
{
SqStack S;
InitStack(S);
Push(S,T);//根指针入栈
BiTree p;
while(!StackEmpty(S))
{
while(GetTop(S,p)&&p)
{
visit(p->data);
Push(S,p->lchild);
}
Pop(S,p);//删除空节点
if(!StackEmpty(S))
{
Pop(S,p);
Push(S,p->rchild);
}
}
return 1;
}
int LastOrderTraverse(BiTree T,void (* visit)(TElemType e))
{
SqStack S;
InitStack(S);
Push(S,T);//根指针入栈
BiTree p;
BiTree pre;//前一个节点;
while(!StackEmpty(S))
{
GetTop(S,p);
if( (p->lchild==NULL&&p->rchild == NULL) || (pre!=NULL&&(p->lchild==pre||p->rchild==pre)))
{
Pop(S,p);
visit(p->data);
pre = p;
}else{
if(p->rchild!=NULL)
Push(S,p->rchild);
if(p->lchild!=NULL)
Push(S,p->lchild);
}
}
return 1;
}
int main()
{
char s[50] ;
char ch;
BiTree T;
printf("请输入字符串构造二叉树\n");
CreateBiTree(T);
printf("中序非递归遍历二叉树\n");
InOrderTraverse(T,visit);
printf("\n");
printf("先序非递归遍历二叉树\n");
PreOrderTraverse(T,visit);
printf("\n");
printf("后序非递归遍历二叉树\n");
LastOrderTraverse(T,visit);
printf("\n");
return 0;
}