一、非递归前序遍历
void TreversePreorder(struct BTree *T)
{
struct BTree *stack[1000],*p=T;
int top=0;
while(p||top)
{
if(p)
{
printf("%d ",p->data);
stack[top++]=p;
p=p->left;
}
else
{
p=stack[--top];
p=p->right;
}
}
}
二、非递归中序遍历
void TreverseInorder(struct BTree *T)
{
struct BTree *stack[1000],*p=T;
int top=0;
while(p||top)
{
if(p)
{
stack[top++]=p;
p=p->left;
}
else
{
p=stack[--top];
printf("%d ",p->data);
p=p->right;
}
}
}
三、非递归后序遍历
void TreversePostorder(struct BTree *T)
{
struct BTree *stack[1000],*p=T,*r=NULL;
int top=0;
while(p||top)
{
if(p)
{
stack[top++]=p;
p=p->left;
}
else
{
p=stack[top-1];
if(p->right&&p->right!=r)//判断右子树,不为空且未被访问则需要先遍历
{
p=p->right;
stack[top++]=p;//当前右子树压栈
p=p->left;
}
else//右子树为空,则直接访问
{
p=stack[--top];
printf("%d ",p->data);
r=p;//r保存节点
p=NULL;
}
}
}
}