一、非递归前序遍历
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;//r记录上一个已经访问节点
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;//p指向下一个将要访问的节点
}
else//右子树为空或者右子树已经被访问
{
p=stack[--top];
printf("%d ",p->data);
r=p;//r保存节点
p=NULL;
}
}
}
}