实现二叉树的非递归遍历算法,并对用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”创建的二叉树进行测试。
/*
*Copyright (c) 2014,烟台大学计算机学院
*All rights reserved.
*文件名称:Annpion.cpp
*作者:王耀鹏
*完成日期:2015年12月26日
*版本号:v1.0
*
*问题描述:二叉树的非递归遍历
*输入描述:无
*输出描述:输出二叉树的非递归遍历
*/
#include <stdio.h>
#include "BTree.h"
void PreOrder(BTNode *b)
{
if(b!=NULL)
{
BTNode *st[MaxSize],*p;
int top=-1;
st[++top]=b;
while(top>-1)
{
p=st[top];
--top;
printf("%c ",p->data);
if(p->rchild!=NULL)
{
++top;
st[top]=p->rchild;
}
if(p->lchild!=NULL)
{
++top;
st[top]=p->lchild;
}
}
}
}
void PreOrder1(BTNode *b)
{
if(b!=NULL)
{
BTNode *st[MaxSize],*p;
int top=-1;
p=b;
while(top>-1||p!=NULL)
{
while(p!=NULL)
{
printf("%c ",p->data);
++top;
st[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=st[top];
--top;
p=p->rchild;
}
}
}
}
void InOrder(BTNode *b)
{
if(b!=NULL)
{
BTNode *st[MaxSize],*p;
int top=-1;
p=b;
while(top>-1||p!=NULL)
{
while(p!=NULL)
{
++top;
st[top]=p;
p=p->lchild;
}
if(top>-1)
{
p=st[top];
--top;
printf("%c ",p->data);
p=p->rchild;
}
}
}
}
void PostOrder(BTNode *b)
{
if(b!=NULL)
{
BTNode *st[MaxSize],*p,*q;
int top=-1,flag;
p=b;
do
{
while(p!=NULL)
{
++top;
st[top]=p;
p=p->lchild;
}
q=NULL; //q用来记录右子树是否已经访问过
flag=1; //表示左子树已访问或为空
while(top>-1&&flag==1)
{
p=st[top];
if(p->rchild==q)
{
printf("%c ",p->data);
--top;
q=p;
}
else
{
p=p->rchild;
flag=0;
}
}
}while(top>-1);
}
}
int main()
{
BTNode *b;
CreateBTNode(b,"A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))");
printf("二叉树b:");
DispBTNode(b);
printf("\n二叉树的先序算法1:");
PreOrder(b);
printf("\n二叉树的先序算法2:");
PreOrder1(b);
printf("\n二叉树的中序算法 :");
InOrder(b);
printf("\n二叉树的后序算法 :");
PostOrder(b);
DestroyBTNode(b);
return 0;
}
运行结果:
注:在main函数中,创建的用于测试的二叉树如下——